2017-04-27 20 views
2

我有一个非常简单的php redis应用程序,它在某些事件中创建键。所有钥匙都只是计数器,并且过期时间为24小时。基本上每个关键点都需要24小时滚动窗口才能收集一些统计数据。Redis:KEYS *的结果如何排序?

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控制台),我会怀疑一个按时间顺序生成日期顺序。但是,这并非如此。他们都没有按字母顺序排序,按价值...

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

回答

7

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

总之keysscan的结果不以任何方式排序,结果顺序与redis的哈希表的内部存储器结构有关。

关于你的PHP脚本,你可以通过一个简单的命令去做,没有existssetexpireat只需运行:

SET key 1 EX 86400 NX

EX 86400意味着到期的86400(1天)秒内从现在

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

如果此命令返回(零)正常运行INCR key它的意思是密钥已经存在。 BTW INCR命令不会删除您的过期设置。

+1

一个几乎完美的回复 - 取消了一个邪恶的模式,为问题提供了答案,并且教导了适当的Redis - 如果可以的话,他会提高两次投票。你所描述的最后一个伪PHP例子会使它完美无缺; p –

+0

嗨Itamar,不知道他在用什么客户端:)顺便说一下,在特拉维夫北部有一杯咖啡是很好的。我们是邻居=) – h0x91B

+0

关于客户的公平点。我很乐意做到这一点&&选择标签(自然地假设没有甜点) - 与我联系,我们会做到这一点。 –