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

Rob*_*b N 3 redis redis-3.2

假设我有一个带有一百万个键的 Redis 实例。键包含团队 ID 和人员 ID,值包含有关团队与人员关联的一些信息。键示例:

team:1:person:123
team:2:person:234
team:2:person:345
...
Run Code Online (Sandbox Code Playgroud)

我可以使用scan带有模式的 a 来获取给定团队中的所有人员。例如,scan 0 match "team:123:person:*"会开始让团队 123 中的每个人都加入。

听起来这不是迭代团队中人员的有效方法,因为扫描的时间复杂度为 O(N),其中 N 是数据库中键的数量。但我想确认一下——是这样吗?

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

如果它确实扫描了所有内容,那么我想如果我想快速迭代团队中的人员,我需要将人员 ID 集存储在团队 ID 下。就像是:

sset team:2:people 234 345 ...
Run Code Online (Sandbox Code Playgroud)

Ita*_*ber 5

但我想确认一下——是这样吗?

经证实,确实如此。

将人员 ID 集存储在团队 ID 下

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