使用Redis通知和新闻区域

时间:2014-02-17 16:00:05

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

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

在我的系统中,用户可以关注其他用户,例如照片,对其进行评论并上传新照片。

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

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

用户30(他的身份证)添加了3张新照片,我将此信息添加到了照片事件: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等)或在客户端处理此数据

1 个答案:

答案 0 :(得分: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查看通知时,您只会使用ZRANGEBYSCORE user1EventsKey ts2 +inf显示tsA之后的所有事件以获取所有事件键,然后逐个显示事件。

PS。时间戳可以以UNIX格式存储。

我希望这会有所帮助。