gpt4 book ai didi

javascript - 如何从Node获取多个Redis key的TTL

转载 作者:可可西里 更新时间:2023-11-01 11:13:10 25 4
gpt4 key购买 nike

我正在尝试显示所有看起来像“myprefix:*”的键及其 TTL 的 View 。然后,我可以允许管理员使 key 过期或“触摸它”(即在过期时间后增加一个小时)。

我可以使用 redisClient.keys('myprefix:*', (err, keys) => {}) 来获取我的 key ,但是 redisClient.ttl命令只接受一个键,而不是一个数组。我不想遍历数组并发送 n 个 ttl 命令。

我知道我可能可以使用 multi 来发送 ttl 命令的事务,但我想知道是否有更好的方法(在 JavaScript 中 - 不是shell) 在一个/两个命令中获取所有 key 及其 TTL?

最佳答案

由于 Redis 嵌入了一个 Lua interpreter ,一个解决方案是创建一个像这样的 Redis Lua 脚本:

local keys = redis.call('keys','myprefix:*')
local result = {}
for i,k in ipairs(keys) do
local ttl = redis.call('ttl', k)
result[i] = {ttl}
end
return result

使用ioredis,可以简化NodeJS中Redis Lua脚本的声明:

var Redis = require('ioredis');
var redis = new Redis();

// This will define a command getTtls:
redis.defineCommand('getTtls', {
numberOfKeys: 1,
lua: "local keys = redis.call('keys', KEYS[1]..':*')\n local result = {}\n for i,k in ipairs(keys) do \n local ttl = redis.call('ttl', k)\n result[i] = {ttl}\n end\n return result"
});

// now invoke this new command, giving the prefix as a parameter
redis.getTtls('myprefix', function (err, result) {
console.log(result);
});

脚本在您的 NodeJS 应用程序中定义,但由 Redis 执行。

不要忘记在生产中使用 KEYS 命令通常不是一个好主意,因为它会在一次操作中扫描整个数据库,因此会使您的 Redis 实例在可能相当长的时间内对其他请求无响应(这取决于关于数据库中键的数量)。如果这在您的用例中是一个问题,您可能需要使用 SCAN命令代替。

关于javascript - 如何从Node获取多个Redis key的TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com