我有一个非常简单的 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

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

关于你的 php 脚本,你可以通过一个命令来完成,没有 exists set expireat 只需运行:
SET key 1 EX 86400 NXEX 86400 表示从现在起 86400(1 天)秒后过期
NX 表示仅当 key 不存在时才创建 key 。

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

关于php - Redis:KEYS * 的结果是如何排序的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43652737/

10-15 10:05