【问题标题】:Redis: How is the result of KEYS * sorted?Redis:KEYS *的结果如何排序?
【发布时间】:2017-09-24 22:49:27
【问题描述】:

我有一个非常简单的 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 控制台中)提取我所有密钥的概述时,我会怀疑创建日期的时间顺序。然而,情况并非如此。它们也不是按字母顺序,按值排序...

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

【问题讨论】:

    标签: php redis phpredis


    【解决方案1】:

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

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

    关于你的php脚本,你可以通过一个命令来完成,不用existssetexpireat直接运行:

    SET key 1 EX 86400 NX

    EX 86400 平均在 86400(1 天)秒后过期

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

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

    【讨论】:

    • 一个近乎完美的回答 - 根除邪恶模式,提供问题的答案,并教授正确的 Redis - 如果可以的话,我会投票两次。您所描述的最后一个伪 PHP 示例将使其完美;p
    • 嗨 Itamar,不知道他使用的是什么客户 :) 顺便说一句,在特拉维夫北部偶尔喝杯咖啡会很好。我们是邻居=)
    • 关于客户的公平点。我很乐意这样做 && 选择标签(假设没有甜点,自然) - 联系我,我们会做到的。
    猜你喜欢
    • 2020-01-15
    • 2013-05-16
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2014-09-14
    相关资源
    最近更新 更多