Redis,部分匹配键与行尾

时间:2015-05-27 03:28:32

标签: redis in-memory-database nosql

这是一个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是一个糟糕的选择,有人可以推荐一种不同的方法吗?如果必须,我愿意编辑关键名称。

2 个答案:

答案 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。