我有一个相册系统,人们可以上传照片并与其他用户互动。我使用 mySql 和 Redis 来处理流量和存储数据。
在我的系统中,用户可以关注其他用户,如照片、评论和上传新照片。
在这种情况下,我想在他们的墙上显示用户关注者的所有事件(如 facebook 时间线)。
比如我关注用户30、40、50、60、70、80id。每当他们添加新照片时,我都希望在我的墙上看到它们。问题是这样的:
用户 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]
对于第二种情况,我怎么知道墙主看到的最后一张照片是什么?根据什么,我应该决定"new"号。哪一个是合理的方法;将此数据保存在服务器端(关注者的整个“最后一次看到”组合(例如:用户 50 等最后一次看到用户 30 的 ID 等)或在客户端处理此数据
最佳答案
在我看来,这个功能应该在服务器端处理,特别是如果您希望用户使用多种类型的客户端(例如,浏览器、电话等)
您的每个事件都应该有一个时间戳,以便了解每个事件发生的时间并能够相应地进行范围搜索,以防您需要获取例如过去 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格式存储。
希望对您有所帮助。
关于database-design - 使用 Redis 的通知和新闻区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833700/