我之前从未使用过redis,但我一直有意义,似乎我当前的用例是合适的。
我本质上是在尝试构建一个消息传递应用。当一个用户发送另一条消息时,发送到服务器的数据如下所示:
{ from_user: 'alice', for_user: 'bob', payload: 'hello!', timestamp: 1404695488 }
我希望能够做的是:
鉴于alice,请查看已向alice发送alice尚未阅读的消息的所有用户
给定alice和bob,返回一个列表,列出了所有已发送alice的消息,我可以从中弹出alice读过的内容。一旦爱丽丝读完了鲍勃发给她的所有信息,那么#1就不会回来了。
如果我还没有澄清,请告诉我。此外,我选择redis的另一个原因是,由于这是一个消息传递应用程序,我想使用Pub / Sub功能。
答案 0 :(得分:0)
解决此问题的一种方法是在发送邮件时更新以下数据结构:
未读邮件:为存储其未读邮件的每个用户保留一个有序集。使用时间戳作为分数并连接时间戳&有效负载作为成员,例如:ZADD unread-messages:bob:alice 1404695488 "1404695488:hello!"
未读消息的发件人:为存储发件人的每个用户保留一组,即:SADD unread-senders:bob alice
。
向所有向他发送过他尚未阅读的消息的用户提供Bob SMEMBERS unread-senders:bob
。
当Bob阅读邮件时:
ZREM unread-messages:bob:alice "1404695488:hello!"
。EXISTS unread-messages:bob:alice
检查是否存在未读消息密钥 - 如果没有任何消息,Redis将删除它。如果密钥已删除,请从使用以下内容的未读发件人中删除相关用户:SREM unread-senders:bob alice
。注意:您希望执行实现添加未读消息并以原子方式删除它的操作,因此请使用MULTI / EXEC块或Lua脚本来实现此目的。