缓存复杂数据的最佳方式

我有一张表,用于根据号码前缀存储语音通话的费用:


Prefix  ratio 

44      0.01597

447     0.04958

447530  0.03

447531  0.048

447532  0.04950

1       0.1

97      0.1

在表中查找数字前缀并不复杂,因为需要最大匹配前缀。例如

4475122112 的前缀是

447,4475302112 的前缀是 447530


我想将表缓存在内存中,以通过减少数据库交互来提高性能。由于获取数字前缀(然后是它的速率)需要在缓存上进行搜索


我找到了两种方法:


将它们存储在纯映射中。在地图上搜索可以像扫描所有地图一样简单(也许是懒惰的)。

将链表结构创建为树。而短前缀接近根,最长前缀接近叶子。

现在,缓存此类数据的最佳方式是什么?或者有没有其他机制?


宝慕林4294392
浏览 82回答 1
1回答

狐的传说

将它们存储在地图中,然后尝试您要查找其费用的号码。如果数字(键)不在地图中,则切断其最后一位数字并重复。这样,如果您找到匹配项,则可以保证这将是最长的前缀。这是一个示例查找函数: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 true447530 0.03 true0 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 true447530 0.03 true 0 false0123 0.05 true
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go