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

标签 php redis phpredis

我有一个非常简单的 php redis 应用程序,它在某些事件中创建 key 。所有 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("*"); (或在 redis-cli 控制台中使用 keys *),我怀疑是按创建日期的时间顺序排列的。然而,事实并非如此。它们也不是按字母顺序、按值...

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

最佳答案

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

反正keysscan 的结果是不以任何方式排序的,结果的顺序与redis 的哈希表的内部内存结构有关。

关于你的 php 脚本,你可以通过一个命令来完成,没有 exists set expireat 只需运行:

SET 键 1 EX 86400 NX

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

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

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

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

相关文章:

php - 使用php将关联数组插入mysql

php - 将 laravel 文件迁移到 xampp 服务器时出错

php - 页面地址未显示 ID 号

ruby-on-rails - Sidekiq 和 Puma 中的 Redis 变量,线程安全吗?

redis - phpredis调试方法不起作用

php - 使用 phpredis 向 Redis 添加一组整数

php - 导入 CSV 文件时无法插入日期?

node.js - 使用 NodeJS 的 CloudFoundry 上的 Redis 失败

cassandra - 如何存储唯一的 "Likes"或 "Views"或按比例设置?

PHP7.4 Redis上的Session存储问题