我在Redis中存储了1000到10,000个密钥,它们的值类型是list。 当一个新项目被添加到任何一个现有列表时,我需要通知我的golang程序。 收到通知后,我需要生成一个新的goroutine并执行一个小操作。
我正在使用redigo连接redis连接池。
在不重载Redis实例的情况下,解决此问题的最佳方法是什么?
答案 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/