作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试显示所有看起来像“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/
我是一名优秀的程序员,十分优秀!