我们可以使用 keys 命令和 scan 命令,但是会发现使用 scan 更好。
1. 使用 keys 命令
直接使用 keys 命令查询,但是如果是在生产环境下使用会出现一个问题,keys 命令是遍历查询
的,查询的时间复杂度为 O(n),数据量越大查询时间越长。而且 Redis 是单线程,keys 指令会导
致线程阻塞一段时间,会导致线上 Redis 停顿一段时间,直到 keys 执行完毕才能恢复。这在生产
环境是不允许的。除此之外,需要注意的是,这个命令没有分页功能,会一次性查询出所有符合条
件的 key 值,会发现查询结果非常大,输出的信息非常多。所以不推荐使用这个命令。
2. 使用 SCAN 命令
推荐使用 SCAN 命令,它是为了替代 KEYS 命令而设计的。SCAN 命令提供了一种方式来逐步迭代键空间,从而避免了长时间的阻塞。以下是如何使用 SCAN 命令来查找以特定前缀开头的键:
SCAN 0 MATCH prefix:* COUNT 1000
这里的参数解释:
- 0 是迭代的起始游标。
- MATCH prefix:* 指定了键名前缀匹配模式(假设前缀是 prefix:)。
- COUNT 1000 建议 Redis 在每次迭代中返回的大概键的数量。这个数值可以根据你的实际情况调整,较大的值可以减少网络请求的次数,但可能会增加单次命令的延迟。
import redis
# 连接到 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 初始游标从 '0' 开始
cursor = '0'
while True:
# 执行 SCAN 命令
cursor, keys = r.scan(cursor=cursor, match='prefix:*', count=1000)
for key in keys:
print(key.decode('utf-8')) # 解码字节类型的 key 为字符串
# 当 cursor 为 '0' 时,表示 SCAN 完成
if cursor == '0':
break
SCAN 命令在完成所有数据的扫描后返回的游标值为 ‘0’