使用前缀匹配模式的redis扫描是否会扫描数据库中的所有密钥?

时间:2016-12-27 16:47:53

标签: redis redis-3.2

我们说我有一个拥有一百万个密钥的redis实例。密钥包含团队ID和人员ID,值包含有关该团队人员关联的一些信息。示例键:

team:1:person:123
team:2:person:234
team:2:person:345
...

我可以使用带有模式的scan来获取特定团队中的所有人。例如,scan 0 match "team:123:person:*",将开始让团队123上的所有人。

听起来这是一种迭代团队中人员的有效方式,因为扫描是O(N),其中N是数据库中的键数。但我想证实 - 是这样吗?

具有树索引的数据库可能只需要扫描树的一小部分,并使用具有该前缀的键。

如果它确实扫描了所有内容,那么我想如果我想快速迭代团队中的人员,我需要将一组人员ID存储在团队ID下。类似的东西:

sset team:2:people 234 345 ...

1 个答案:

答案 0 :(得分:2)

  

但我想证实 - 是这样吗?

确认,情况确实如此。

  

将一组人员ID存储在团队ID

这正是你应该做的。但是,请注意,一旦该集合变得过大而执行SMEMBERS可能是一项昂贵的操作(因此即将进行整体性能)。如果这确实成为一个问题,请使用SSCAN来悠闲地检索它。