3

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

我正在将 redigo 用于 redis 连接池。

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

4

2 回答 2

5

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

更多细节可以在文档中找到:http ://redis.io/topics/notifications

于 2016-01-24T07:33:54.603 回答
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 脚本会像往常一样更新列表,但也会将更新的键名发布到通知 pub/sub,这将允许监视脚本 (golang) 执行某些操作。您也可以只推送到另一个队列,然后进行长轮询。

这个链接有更多关于 Lua 和 Redis 的信息:https ://www.redisgreen.net/blog/intro-to-lua-for-redis-programmers/

于 2016-01-24T03:56:36.550 回答