如何在redis密钥到期时收到通知?

时间:2016-04-14 06:40:18

标签: node.js redis

当密钥过期时,为什么无法通知以下代码?

我想使用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)

2 个答案:

答案 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 块中的代码会触发这些事件:

  1. keyspace@0:test ======
  2. keyevent@0:set ======
  3. keyspace@0:test ======
  4. keyevent@0:expire ======
  5. keyspace@0:test ======
  6. keyevent@0:过期 ======

正如你所看到的,它实际上从不触发 del 事件。所以这就是您没有收到通知的原因。

所以你需要订阅 keyevent@0:expired 频道。