我最近一直想知道如何在我的迷你社交网络上存储用户通知(您可以将其视为Facebook通知)。它们被创造一次而永远不会改变。会有很多。
我需要按用户查询它们并按创建日期排序。
看起来像某种NoSql解决方案会做,我想尝试redis。但是因为我之前从未使用它,所以我不知道应该使用哪种数据结构以及如何有效地使用主题。
感谢您的帮助!
答案 0 :(得分:1)
Redis非常适合此用例。 使用sorted set为每个用户提供通知,并将unix时间戳记作为分数。
您可以为每个已排序的集合提供基于以下模式的键:
user:<user id>:notifications
为给定用户添加通知:
ZADD <current_unix_timestamp> user:<user_id>:notifications "some notification"
然后使用ZREVRANGEBYSCORE获取最近的通知
ZREVRANGEBYSCORE user:<user id>:notifications +inf <last_visit_timestamp>
或者,如果您想要此用户的所有通知,从最新到最旧:
ZREVRANGEBYSCORE user:<user id>:notifications +inf -inf
更新:不要忘记Redis默认是内存数据库;如果磁盘上的两个写入之间发生崩溃,您可能会丢失一些通知。写操作的频率在redis.conf文件中定义。如果通知对您至关重要,并且您在崩溃后无法重建它们: *考虑使用2个Redis实例,一个奴隶和一个主人,由Redis Sentinel监控; *或将写入设置转为“在每次写入操作时保存在磁盘上”,但这意味着您将失去速度; *或使用其他数据库。