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

Does a redis scan with a prefix match pattern scan all keys in database?

假设我有一个带有一百万个键的 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 ...

But I want to confirm - is that the case?

确认,确实如此

store the set of person IDs under a team ID

这正是你应该做的。但是请注意,一旦 Set 变得太大,SMEMBERS could be an expensive operation (hence impending the overall performance). If that indeed becomes an issue, use SSCAN 就无法像从容地那样检索它。