【问题标题】:Notification and News Area by using Redis使用 Redis 的通知和新闻区
【发布时间】:2014-03-17 00:31:18
【问题描述】:

我有一个相册系统,人们可以上传照片并与其他用户互动。我使用 mySql 和 Redis 来处理流量和存储数据。

在我的系统中,用户可以关注其他用户,如照片、评论和上传新照片。

在这种情况下,我想在他们的墙上显示用户关注的所有事件(如 facebook 时间线)。

例如,我关注用户 30、40、50、60、70 和 80 个 id。每当他们添加新照片时,我都希望在我的墙上看到它们。问题是这样的:

用户 30(他的 id)添加了 3 张新照片,我将此信息添加到 photoevents:30:photoids -> [55,56,57]。 它在我的墙上是这样看到的:

User 30 added 3 new photos [55,56,57]

然后用户 40 添加了 2 张新照片 [5,6] 它在我的墙上是这样看到的:

 User 40 added 2 new photos [5,6].     
 User 30 added 3 new photos [55,56,57]

然后用户 30 又添加了 2 张照片 [58,59]

应该看什么?

这样

 User 30 added 5 new photos [55,56,57,58,59].     
 User 40 added 2 new photos [5,6]

或者

 User 30 added 2 new photos [58,59]
 User 40 added 2 new photos [5,6].     
 User 30 added 3 new photos [55,56,57]

对于第二种情况,我怎么知道墙主看到的最后一张照片是什么?根据什么,我应该决定“新”号码。哪一个是合理的做法;将这些数据保存在服务器端(关注者的整个“最后一次看到”组合(例如:用户 50 等最后一次看到的用户 30 的 id)或在客户端处理这个

【问题讨论】:

    标签: database-design data-structures architecture redis social-networking


    【解决方案1】:

    在我看来,这个功能应该在服务器端处理,特别是如果您希望用户使用多种类型的客户端(例如,浏览器、电话等)

    您的每个事件都应该有一个时间戳,以便了解每个事件发生的时间并能够相应地进行范围搜索,以防您需要获取最近 24 小时的事件或之后的事件时间戳 X。

    然后,当关注另一个用户的用户查看她的通知时,您可以将时间戳设置为检查点,以了解该用户已经看到的事件,然后仅显示该检查点之后的事件。

    在我们的一个项目中,我在 REDIS 中实现时间序列的方式是使用排序集 (http://redis.io/topics/data-types#sorted-sets)。在您的情况下,您可以存储:

    user1EventsKey -> [{ts1, eventKey1}, {ts2, eventKey2}, {ts3, eventKey3},... ]  
                                                               # This is the sorted set
    eventKey1 -> [photo1, photo2, photo3]
    eventKey2 -> [photo4, photo5]
    ...
    
    user2Checkpoint -> tsA   #where  ts2 < tsA < ts3
    

    现在您知道,下次 user2 查看通知时,您只会显示 tsA 之后的任何事件,使用 ZRANGEBYSCORE user1EventsKey ts2 +inf 获取所有事件键,然后您可以一一显示事件。

    附言。时间戳可以以 UNIX 格式存储。

    我希望这会有所帮助。

    【讨论】:

    • 我决定使用像你这样的建议。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多