背景资料
我需要使用键查询值,但需要以特定的优先顺序对键进行评估,其中顺序为:
- 如果存在完全匹配,则使用与匹配键关联的值
- 如果键属于 db 中定义的键范围,则使用与该范围关联的值。
- 如果没有匹配的键,使用默认值
为了更好地解释这个问题,我将画一个这样的哈希:
'northam' hash
key value
=====================
12345 abc
default ddd
2000[0-10] bbb
使用上述存储结构,我需要能够:
- 使用键 12345 进行查询并让数据库返回 abc,因为它找到了完全匹配。
- 如果我使用键“33333”进行查询,那么我只想返回与“默认”键关联的值 ddd,因为我没有 33333 的键/值。
- 如果我使用键“2000”或“2004”查询,我希望它找到值 bbb。
问题
在 REDIS 中,我可以以某种方式创建像“2000 [0-10]”这样的密钥吗?
有一个更好的方法吗?我知道我可以以编程方式扩展 2000[0-10] 并将每个值作为单独的条目存储在表中。但是如果用户更新这个范围并将其更改为 2000[15-21],那么清理就会有点混乱。
到目前为止我尝试过的
我一直在玩排序集?我不完全理解它们是如何工作的。但到目前为止,我已经尝试过这样的事情:
127.0.0.1:6379[1]> zadd northam 2000 ddd 2002 ddd
(integer) 1
127.0.0.1:6379[1]>
现在我正在尝试查看是否可以查询 2000(或 2000-2010 范围内的任何其他值)并返回“ddd”。但它不起作用。
编辑 1
因此,在阅读了一些关于索引/二级索引的信息后,这是我一直在使用的原型数据结构:
127.0.0.1:6379[3]> zadd northamerica 0 2000:2010:1234512345
(integer) 1
127.0.0.1:6379[3]> zadd northamerica 0 2011:2014:00000000000
(integer) 1
第一条记录,我想说我的范围内的起始数字是 2000,结束数字是 2010。对于该范围内的任何数字,使用值 1234512345 但现在我需要知道如何执行查询。因此,例如,如果用户请求知道要为键“2009”使用什么值,我不知道如何对该结构运行查询以发现它应该使用 1234512345
编辑 2
所以最后,我想我决定使用字典索引,如上所示,然后将逻辑烘焙到应用程序本身中进行解释。例如,
127.0.0.1:6379[3]> zrange northamerica 0 -1
1) "2000:2010:12312312345"
2) "2011:2014:00000000000"
3) "2015:2015:11111111111"
127.0.0.1:6379[3]>
该应用程序可以查询北美的所有记录,然后当它返回上述列表时,它可以通过“:”将每个记录拆分(成数组)以确定存在哪些范围。