我是 Redis 的新手。我正在设计一种发布/订阅机制,其中为至少连接了一个用户(浏览器)的每个客户端(业务客户端)提供了一个特定的 channel 。然后,这些用户会收到他们所属的客户端的信息。
我需要 Redis,因为我有一个分布式系统,所以存在一个将数据推送到相应客户端 channel 的后端,然后存在一个 webapp,它有自己的服务器(多个实例)来保存用户连接(websockets)。
恢复:
- 后台是发布者,webapp服务器是订阅者
- 一个客户有多个用户
- 每个客户一个 channel ,至少有 1 个用户连接
- 如果客户端没有连接用户,则不存在 channel
- 后端将数据推送到每个现有的客户端 channel
- Webapp 服务器仅使用来自与连接到自身的用户相对应的客户端 channel 的数据。
因此,为了减少工作量,我不想从我的后端将数据推送到没有连接用户的客户端。因此,我似乎需要将已连接用户的列表从我的 Web 应用程序共享到我的后端,以便后端可以决定将哪些客户端数据推送到 Redis。共享该数据的明显解决方案是使用相同的 Redis 实例。
我的方法是在 Redis 中使用这样的 key :
[USERS:
User1/ClientA/WebappServer1, User2/ClientB/WebappServer1,
User3/ClientA/WebappServer2
]
那么我的问题来了......
如果我的 Webapps 节点之一崩溃并且它没有机会从 Redis 中删除与其连接的用户列表,我该如何克服陈旧数据?强>
非常感谢!
最佳答案
首先,祝整个项目顺利 - 听起来很有挑战性也很有趣 :)
我会使用稍微不同的设计来跟踪我的用户 - 让每个客户端/Web 应用程序维护一组(可能按登录时间作为分数排序)他们的用户。为该集合设置一个 TTL,并让客户端/webapp 定期重置它,否则如果拥有进程崩溃,它将过期。
关于Redis 陈旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069762/