在我的设置中,info
命令显示以下内容:
[keys] => 1128
[expires] => 1125
我想找到没有过期日期的那3个密钥。我已经检查过文档无济于事。有什么想法吗?
答案 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
可用。