构造redis键

时间:2014-07-07 01:38:28

标签: redis

我之前从未使用过redis,但我一直有意义,似乎我当前的用例是合适的。

我本质上是在尝试构建一个消息传递应用。当一个用户发送另一条消息时,发送到服务器的数据如下所示:

{ from_user: 'alice', for_user: 'bob', payload: 'hello!', timestamp: 1404695488 }

我希望能够做的是:

  1. 鉴于alice,请查看已向alice发送alice尚未阅读的消息的所有用户

  2. 给定alice和bob,返回一个列表,列出了所有已发送alice的消息,我可以从中弹出alice读过的内容。一旦爱丽丝读完了鲍勃发给她的所有信息,那么#1就不会回来了。

  3. 如果我还没有澄清,请告诉我。此外,我选择redis的另一个原因是,由于这是一个消息传递应用程序,我想使用Pub / Sub功能。

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是在发送邮件时更新以下数据结构:

  1. 未读邮件:为存储其未读邮件的每个用户保留一个有序集。使用时间戳作为分数并连接时间戳&有效负载作为成员,例如:ZADD unread-messages:bob:alice 1404695488 "1404695488:hello!"

  2. 未读消息的发件人:为存储发件人的每个用户保留一组,即:SADD unread-senders:bob alice

  3. 向所有向他发送过他尚未阅读的消息的用户提供Bob SMEMBERS unread-senders:bob

    当Bob阅读邮件时:

    1. 从未读的有序集合中删除它 - ZREM unread-messages:bob:alice "1404695488:hello!"
    2. 使用EXISTS unread-messages:bob:alice检查是否存在未读消息密钥 - 如果没有任何消息,Redis将删除它。如果密钥已删除,请从使用以下内容的未读发件人中删除相关用户:SREM unread-senders:bob alice
    3. 注意:您希望执行实现添加未读消息并以原子方式删除它的操作,因此请使用MULTI / EXEC块或Lua脚本来实现此目的。