Redis 的 Pub/Sub 消息功能可以扩展以创建有趣的分布式事件。假设我们有一个存储在哈希中的结构,但我们只想在特定字段超出订阅者定义的数值时才更新其客户端。我们将监听一个通道模式,然后才获取 status 处的哈希。在此示例中,我们只关心 update_status 在 5 到 9 之间的情况。
> PSUBSCRIBE update_status:[5-9] 1) "psubscribe" 2) "update_status:[5-9]" 3) (integer) 1 [waits]
要更改 status/error_level 的值,我们将有一个子例程,按顺序或在 MULTI/EXEC 块 中运行两个命令。第一个命令设置级别,第二个命令发布通知,值编码在通道本身中。
> HSET status error_level 5 (integer) 1 > PUBLISH update_status:5 0 (integer) 1
收到消息时,我们的客户端应用程序会切换到备用客户端并发出 HGETALL 命令
> HGETALL status 1) "error_level" 2) "5" 3) "last_error" 4) "Crawler returned 404" 5) "timestamp" 6) "1511467605734"
然后我们可以用它来(例如)更新一个长时间运行进程的局部变量。这可以使同一进程的多个实例实时“共享”数据。
这种模式与仅使用 Pub/Sub 相比的优点是,当进程重启时,它可以简单地获取整个状态哈希并开始监听。然后,更改将在任意数量的进程之间同步。如果实例与 Redis 服务器断开连接,作为重新连接的一部分,服务器可以获取状态哈希并重新开始监听。