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

时间:2017-04-27 08:37:29

标签: php redis phpredis

我有一个非常简单的php redis应用程序,可以在某些事件中创建密钥。所有钥匙都只是柜台,过期时间为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控制台)提取所有密钥的概述时,我怀疑按创建日期按时间顺序排列。然而,事实并非如此。它们也没有按字母顺序排列,按价值排序......

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

1 个答案:

答案 0 :(得分:8)

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

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

关于您的php脚本,您可以通过一个命令执行此操作,而exists set expireat只需运行:

SET key 1 EX 86400 NX

EX 86400表示从现在起86400(1天)后到期

NX表示只有在密钥不存在时才创建密钥。

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