我有一个非常简单的 php redis 应用程序,它在某些事件中创建 key 。所有的键都只是计数器,过期时间为 24 小时。基本上每个键都有一个 24 小时的滚动窗口来收集一些统计数据。
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 控制台中)提取所有 key 的概述时,我会怀疑按创建日期的时间顺序。然而,情况并非如此。它们也不是按字母顺序,按值(value)排序......所以我的问题是,这个列表是如何排序的?
最佳答案
首先,不要使用 keys *
它是不是为生产设计的调试功能,你可以杀死你的服务器......
如果您需要以安全的方式枚举 DB 中的所有键,请使用 SCAN
函数和 LIMIT
。
无论如何keys
或scan
的结果没有以任何方式排序,结果的顺序与redis的hashtable的内部内存结构有关。
关于你的 php 脚本,你可以通过一个命令来完成,没有 exists
set
expireat
只需运行:SET key 1 EX 86400 NX
EX 86400
表示从现在起 86400(1 天)秒后过期NX
表示仅当 key 不存在时才创建 key 。
如果此命令返回 (nil) 运行常规 INCR key
,则表示 key 已存在。顺便说一句 INCR
命令不会删除您的过期设置。
关于php - Redis:KEYS * 的结果是如何排序的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43652737/