为了账号安全,请及时绑定邮箱和手机立即绑定

缓存复杂数据的最佳方式

缓存复杂数据的最佳方式

Go
宝慕林4294392 2023-05-15 15:37:51
我有一张表,用于根据号码前缀存储语音通话的费用:Prefix  ratio 44      0.01597447     0.04958447530  0.03447531  0.048447532  0.049501       0.197      0.1在表中查找数字前缀并不复杂,因为需要最大匹配前缀。例如4475122112 的前缀是447,4475302112 的前缀是 447530我想将表缓存在内存中,以通过减少数据库交互来提高性能。由于获取数字前缀(然后是它的速率)需要在缓存上进行搜索我找到了两种方法:将它们存储在纯映射中。在地图上搜索可以像扫描所有地图一样简单(也许是懒惰的)。将链表结构创建为树。而短前缀接近根,最长前缀接近叶子。现在,缓存此类数据的最佳方式是什么?或者有没有其他机制?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

将它们存储在地图中,然后尝试您要查找其费用的号码。如果数字(键)不在地图中,则切断其最后一位数字并重复。这样,如果您找到匹配项,则可以保证这将是最长的前缀。


这是一个示例查找函数:


var prefixCostMap = map[uint64]float64{

    44:     0.01597,

    447:    0.04958,

    447530: 0.03,

    447531: 0.048,

    447532: 0.04950,

    1:      0.1,

    97:     0.1,

}


func lookup(num uint64) (longestPrefix uint64, cost float64, ok bool) {

    longestPrefix = num


    for longestPrefix > 0 {

        cost, ok = prefixCostMap[longestPrefix]

        if ok {

            break

        }

        longestPrefix = longestPrefix / 10 // Cut off last digit

    }


    return

}

测试它:


fmt.Println(lookup(4475122112))

fmt.Println(lookup(4475302112))

fmt.Println(lookup(999))

输出(在Go Playground上尝试):


447 0.04958 true

447530 0.03 true

0 0 false

注意:这不支持以 0 开头的数字。如果您还需要处理它,您可以将数字存储为字符串值,这样初始0数字将被保留。


这是string版本的样子:


var prefixCostMap = map[string]float64{

    "44":     0.01597,

    "447":    0.04958,

    "447530": 0.03,

    "447531": 0.048,

    "447532": 0.04950,

    "1":      0.1,

    "97":     0.1,

    "0123":   0.05,

}


func lookup(num string) (longestPrefix string, cost float64, ok bool) {

    longestPrefix = num


    for longestPrefix != "" {

        cost, ok = prefixCostMap[longestPrefix]

        if ok {

            break

        }

        longestPrefix = longestPrefix[:len(longestPrefix)-1] // Cut off last digit

    }


    return

}

测试它:


fmt.Println(lookup("4475122112"))

fmt.Println(lookup("4475302112"))

fmt.Println(lookup("999"))

fmt.Println(lookup("0123456"))

输出(在Go Playground上尝试):


447 0.04958 true

447530 0.03 true

 0 false

0123 0.05 true


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信