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
.
无论如何,keys
或scan
的结果没有以任何方式排序,结果的顺序与redis哈希表的内部内存结构有关。
关于你的 php 脚本,你可以通过一个命令来完成,没有 exists
set
expireat
只是 运行:
SET key 1 EX 86400 NX
EX 86400
平均在 86400(1 天)秒后到期
NX
表示仅当密钥不存在时才创建密钥。
如果此命令 return (nil) 运行 常规 INCR key
表示密钥已经存在。顺便说一句 INCR
命令不会删除您的过期设置。
我有一个非常简单的 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
.
无论如何,keys
或scan
的结果没有以任何方式排序,结果的顺序与redis哈希表的内部内存结构有关。
关于你的 php 脚本,你可以通过一个命令来完成,没有 exists
set
expireat
只是 运行:
SET key 1 EX 86400 NX
EX 86400
平均在 86400(1 天)秒后到期
NX
表示仅当密钥不存在时才创建密钥。
如果此命令 return (nil) 运行 常规 INCR key
表示密钥已经存在。顺便说一句 INCR
命令不会删除您的过期设置。