Redis如何使用golang监听1000到10,000个列表中的更改?

时间:2016-01-24 03:07:54

标签: go redis redigo

我在Redis中存储了1000到10,000个密钥,它们的值类型是list。 当一个新项目被添加到任何一个现有列表时,我需要通知我的golang程序。 收到通知后,我需要生成一个新的goroutine并执行一个小操作。

我正在使用redigo连接redis连接池。

在不重载Redis实例的情况下,解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

您可以启用Redis'键空间通知并订阅您感兴趣的键/模式上的相关事件。

更多详情可在文档中找到:http://redis.io/topics/notifications

答案 1 :(得分:2)

我还没试过这个,但作为推测,我会使用Redis的Lua来实现2个新命令 - MSR_PUSH和MSR_POP - 它们分别执行以下操作:

-- MSR_PUSH
redis.call("PUSH", KEYS[1], ARGV[1])
redis.call("PUBLISH", "notify", KEYS[1])

-- MSR_POP
local v = redis.call("POP", KEYS[1])
if v then
  redis.call("PUBLISH", "notify", KEYS[1])
end
return v

因此,这些Lua脚本会像往常一样更新列表,但随后也会将更新后的密钥名称发布到notify pub / sub,然后允许观看脚本(golang)执行某些操作。你也可以只是推送到另一个队列,然后进行长时间轮询。

此链接提供有关Lua与Redis的更多信息:https://www.redisgreen.net/blog/intro-to-lua-for-redis-programmers/