当密钥过期时,为什么无法通知以下代码?
我想使用redis,当密钥过期后再通知我。然后我可以做点什么。
var Redis = require('ioredis')
var sub = new Redis()
var pub = new Redis()
var subKey = '__keyevent@0__:del'
sub.subscribe(subKey, function () {
console.log('subscribe success !')
})
sub.on('message', function (channel, message) {
console.log(channel, message, '======')
})
var testKey = 'test'
setTimeout(function () {
pub.multi()
.set(testKey, 'test redis notify')
.expire(testKey, 5)
.exec(function (err) {
if (err) {
console.log(err, 'why err ?')
return
}
console.log('.....')
})
}, 2000)
答案 0 :(得分:6)
您需要服务器端支持密钥空间通知。
redis-cli config set notify-keyspace-events KEA
设置完成后,您可以运行bellow命令来检查:
redis-cli config get notify-keyspace-events
如果您收到如下消息:
1) "notify-keyspace-events"
2) "AKE"
然后,您可以运行代码并获得所需内容。
此外,请注意timing-of-expired-events。
答案 1 :(得分:0)
先决条件:您需要通过在 redis.conf 中输入以下行来启用键空间通知。或者您可以按照上面“sel-fish”的回答临时启用它。
现在,setTimeout 块中的代码会触发这些事件:
正如你所看到的,它实际上从不触发 del 事件。所以这就是您没有收到通知的原因。
所以你需要订阅 keyevent@0:expired 频道。