这是一个2部分问题。
我有一个redis数据库,用以下键存储项目:
记录类型1 :“site_id:1_item_id:3”
记录类型2 :“site_id:1_item_id:3_user_id:6”
我一直在使用KEYS site_id:1_item_id:*
来抓取记录类型1 项目(在本例中为网站1)
不幸的是,它会返回所有类型1和类型2的项目。
获取所有“site_id:1_item_id:3”类型记录的最佳方法是什么?避免包括user_id在内的那些?我可以使用EOL匹配吗?
其次,我读过使用KEYS是一个糟糕的选择,有人可以推荐一种不同的方法吗?如果必须,我愿意编辑关键名称。
答案 0 :(得分:1)
首先要做的是:除非你是本地开发机器上唯一的redis用户,否则你使用KEYS是错误。它会阻止redis实例直到完成,因此任何人在使用密钥时查询它都必须等待密钥查询完成。请改用SCAN。
SCAN将以非阻塞方式迭代条目,并保证您获得所有条目。 我不知道你使用哪种语言来查询它,但在python中,通过扫描查询键并在运行中过滤它们非常容易。
但是,假设你想要使用密钥。在我看来,做KEYS site_id:1_item_id:?
或KEYS site_id:1_item_id:3
就可以了。
你想要的键是否以“3”结束(我不确定我是否完全理解你的问题)。
以下是我在本地计算机上尝试的示例:
redis 127.0.0.1:6379> flushall
OK
redis 127.0.0.1:6379> set site_id:1_item_id:3 a
OK
redis 127.0.0.1:6379> set site_id:1_item_id:3_user_id:6 b
OK
redis 127.0.0.1:6379> set site_id:1_item_id:4 c
OK
// ok so we have got the database cleaned and set up
redis 127.0.0.1:6379> keys *
1) "site_id:1_item_id:3"
2) "site_id:1_item_id:4"
3) "site_id:1_item_id:3_user_id:6"
// gets all the keys like site_id:1_item_id:X
redis 127.0.0.1:6379> keys site_id:1_item_id:?
1) "site_id:1_item_id:3"
2) "site_id:1_item_id:4"
// gets all the keys like site_id:1_item_id:3
redis 127.0.0.1:6379> keys site_id:1_item_id:3
1) "site_id:1_item_id:3"
不要忘记Redis KEYS使用GLOB样式模式,这与正则表达式完全不同。 您可以查看keys documentation examples以确保理解
答案 1 :(得分:0)
这里的正确方法是使用由您维护的密钥索引。不应该以任何传统意义来质疑Redis。