Redis:KEYS *的结果如何排序?
问题描述:
我有一个非常简单的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控制台),我会怀疑一个按时间顺序生成日期顺序。但是,这并非如此。他们都没有按字母顺序排序,按价值...
所以我的问题是,该列表如何排序?
答
首先,不使用keys *
它不是专为生产调试功能,你可以杀死你的服务器...... 如果您需要枚举数据库中的所有钥匙,安全的方式,使用SCAN
函数LIMIT
。
总之keys
或scan
的结果不以任何方式排序,结果顺序与redis的哈希表的内部存储器结构有关。
关于你的PHP脚本,你可以通过一个简单的命令去做,没有exists
set
expireat
只需运行:
SET key 1 EX 86400 NX
EX 86400
意味着到期的86400(1天)秒内从现在
NX
表示仅当它不存在时才创建密钥。
如果此命令返回(零)正常运行INCR key
它的意思是密钥已经存在。 BTW INCR
命令不会删除您的过期设置。
一个几乎完美的回复 - 取消了一个邪恶的模式,为问题提供了答案,并且教导了适当的Redis - 如果可以的话,他会提高两次投票。你所描述的最后一个伪PHP例子会使它完美无缺; p –
嗨Itamar,不知道他在用什么客户端:)顺便说一下,在特拉维夫北部有一杯咖啡是很好的。我们是邻居=) – h0x91B
关于客户的公平点。我很乐意做到这一点&&选择标签(自然地假设没有甜点) - 与我联系,我们会做到这一点。 –