我有一个相册系统,人们可以上传照片并与其他用户互动。我使用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等)或在客户端处理此数据
答案 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格式存储。
我希望这会有所帮助。