在Redis中查找非过期密钥

时间:2012-03-22 07:18:57

标签: redis

在我的设置中,info命令显示以下内容:

[keys] => 1128
[expires] => 1125

我想找到没有过期日期的那3个密钥。我已经检查过文档无济于事。有什么想法吗?

6 个答案:

答案 0 :(得分:52)

从我现在无法找到的网站修改。

redis-cli keys  "*" | while read LINE ; do TTL=`redis-cli ttl "$LINE"`; if [ $TTL -eq  -1 ]; then echo "$LINE"; fi; done;

编辑:注意,这是一个阻止调用。

答案 1 :(得分:2)

如果有人得到错误的参数或错误的参数数量错误, 在$ LINE附近加双引号。

所以,它会是

redis-cli keys  "*" | while read LINE ; do TTL=`redis-cli ttl "$LINE"`; if [ $TTL -eq  -1 ]; then echo "$LINE"; fi; done;

当密钥中有空格时会发生这种情况。

答案 2 :(得分:1)

Wayne Lue的答案运行了,但是使用了Redis warns about

的Redis KEYS命令。
  

警告:将KEYS视为仅应在生产环境中格外小心使用的命令。在大型数据库上执行时,可能会破坏性能。

Redis文档建议使用SCAN。

redis-cli --scan | while read LINE ; do TTL=`redis-cli ttl "$LINE"`; if [ $TTL -eq  -1 ]; then echo "$LINE"; fi; done;

如果要扫描特定的键码,请使用:

 redis-cli --scan --pattern "something*"

答案 3 :(得分:1)

我需要从更大的 (40GB) 数据集中提取未到期的密钥,因此使用 keys 命令不适合我。因此,如果有人正在寻找离线/非阻塞解决方案,您可以使用 https://github.com/sripathikrishnan/redis-rdb-tools 从 redis rdb 转储中提取非过期密钥。

您可以通过 pip 安装库:

pip install rdbtools python-lzf

然后创建简单的解析器来提取过期设置为无的键和值:

from rdbtools import RdbParser, RdbCallback
from rdbtools.encodehelpers import bytes_to_unicode

class ParserCallback(RdbCallback):

    def __init__(self):
        super(ParserCallback, self).__init__(string_escape=None)

    def encode_key(self, key):
        return bytes_to_unicode(key, self._escape, skip_printable=True)

    def encode_value(self, val):
        return bytes_to_unicode(val, self._escape)

    def set(self, key, value, expiry, info):
        if expiry is None:
            print('%s = %s' % (self.encode_key(key), self.encode_value(value)))


callback = ParserCallback()
parser = RdbParser(callback)
parser.parse('/path/to/dump.rdb')

答案 4 :(得分:0)

No

答案 5 :(得分:0)

对我来说,接受的答案似乎不适用于中型数据集,因为它会为每个键运行 redis-cli 命令。

相反,我使用这个 lua 脚本来过滤 redis 服务器内的键:

local show_persistent = ARGV[1] ~= "expiring"

local keys = {}
for i, name in ipairs(redis.call("keys", "*")) do
    local persistent = redis.call("pttl", name) < 0
    if persistent == show_persistent then
        table.insert(keys, name)
    end
end

return keys

这可以称为

$ redis-cli --eval show-persistent-keys.lua

获取没有过期时间的所有密钥。它也可以称为

$ redis-cli --eval show-persistent-keys.lua , expiring

找到所有设置了过期时间的密钥的相反密钥集。

不利的一面是,这可能会阻塞太久(对于 1 M 键似乎没问题)。我会改用扫描,但我碰巧必须在版本 2.6 的旧版 Redis 上运行它,该版本没有 scan 可用。