背景:
我正在尝试使用SCAN命令来获取所有与特定模式匹配的键。我发现即使我在命令中添加了COUNT参数,它仍然不会返回所有匹配的键。这是我的代码:
cursor = '0'
all_keys = []
while cursor != 0:
cursor, keys = r.scan(cursor=cursor, match='my_pattern*', count=100)
all_keys.extend(keys)
print(all_keys)
根据Redis文档,COUNT只是一个建议值,并不保证返回指定数量的键。有没有办法强制SCAN命令返回所有匹配的键?
使用下面的代码,将从游标 0 开始扫描 1000 个对象
SCAN 0 MATCH "foo:bar:*" COUNT 1000
结果,将获得一个要调用的新光标:
SCAN YOUR_NEW_CURSOR MATCH "foo:bar:*" COUNT 1000
要扫描整个列表,你需要调用 SCAN 直到光标返回零(即整个扫描)
使用 INFO 命令获取密钥数量,例如:
db0:keys=YOUR_AMOUNT_OF_KEYS,expires=0,avg_ttl=0
然后调用:
SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS
批量脚本
#!/bin/bash # Redis服务器连接信息 REDIS_HOST="your_redis_host" REDIS_PORT="your_redis_port" REDIS_PASSWORD="your_redis_password" # 初始化游标 cursor="0" # 循环遍历所有key while [ "$cursor" != "0" ] do # 执行SCAN命令 result=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD --scan --pattern "*" count 1000) cursor=$(echo "$result" | head -n 1) keys=$(echo "$result" | tail -n +2) for key in $keys do ttl=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD TTL $key) if [ "$ttl" -eq -1 ]; then echo "Key with no expiration: $key" fi done done
你的答案