Redis:KEYS * 的结果是如何排序的?

Redis: How is the result of KEYS * sorted?

我有一个非常简单的 php redis 应用程序,它在某些事件中创建密钥。所有密钥都只是计数器,并且有 24 小时的过期时间。基本上每个键的 24 小时滚动 window 来收集一些统计数据。

if ($redis->exists($key)) {
    $redis->incr($key); 
}
else {
    $redis->set($key, '1');
    $now = time(); // current timestamp
    $redis->expireAt($key, $now + 86400);
}

当我使用 $list = $redis->keys("*");(或使用 keys * 在 redis-cli 控制台中提取所有密钥的概览时),我怀疑按创建日期的时间顺序排列。然而,事实并非如此。它们也不是按字母顺序、按值排序...

所以我的问题是,这个列表是如何排序的?

首先,不要使用 keys * 它不是为生产设计的调试功能,你可以杀死你的服务器...... 如果您需要以安全的方式枚举数据库中的所有键,请使用 SCAN 函数和 LIMIT.

无论如何,keysscan的结果没有以任何方式排序,结果的顺序与redis哈希表的内部内存结构有关。

关于你的 php 脚本,你可以通过一个命令来完成,没有 exists set expireat 只是 运行:

SET key 1 EX 86400 NX

EX 86400 平均在 86400(1 天)秒后到期

NX 表示仅当密钥不存在时才创建密钥。

如果此命令 return (nil) 运行 常规 INCR key 表示密钥已经存在。顺便说一句 INCR 命令不会删除您的过期设置。