在Redis中,SCAN命令如何强制返回所有匹配某个模式的键?

what 发表于: 2024-07-12   最后更新时间: 2024-07-12 11:12:50   403 游览

背景:

我正在尝试使用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命令返回所有匹配的键?

发表于 2024-07-12
添加评论

使用下面的代码,将从游标 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
你的答案

查看redis相关的其他问题或提一个您自己的问题