我正在尝试使用 Redis 创建一个通知系统,而不是使用我用于系统其余部分的 MySQL。这样做的原因是我真的不需要保存那么多数据,因此可以将其保存在内存中,而且我希望它轻巧且快速。
通知将暂时保留。我的意思是我不想保存所有通知,但更像是为每个用户保存 50 个最新的看不见的通知。所以我首先想到的是使用长度上限为 50 的链表。
我需要为通知保存此信息:
postId
commentId
type
time
userId
username
image
所以也许是像这样的 JSON 序列化字符串:
{"postId":1,"commentId":10,"type":1,"time":1462960058,"userId":2,"username":"Alexander","image":"ntfpRrgx.png"}
通知在客户端会这样输出:
Alexander commented on your post.
Alexander replied to your comment.
类型决定通知的类型。我可以处理“类型”检查客户端并相应地输出通知格式。但这是我遇到困难的部分。
1) 我需要能够以有序的方式保存通知,以便我知道哪个通知是最新的。
2) 我需要能够知道通知何时被看到,这样它就不会被注册为不再被看到。
3) 我需要计算可以向用户显示的看不见的通知。如果用户点击通知,我需要将其标记为已查看通知并减少未查看通知的数量。
4) 如果用户希望这样做,我需要能够将所有通知标记为已标记。
5) 我需要能够获得通知的子集,无论是可见的还是不可见的,例如 MySQL 上的偏移量和限制。例如,用户看到最新的 5 条通知,但他可以单击下一步按钮并查看接下来的 5 条,以及接下来的 5 条,依此类推。
我不知道如何在 Redis 上完成所有这些。
列表或集合的键可以是user:1:notification
。我知道一个列表是排序的,我们可以从头部和尾部添加和删除。但是我如何才能达到所有这些要点呢?
最佳答案
1:可以使用redis排序集(zset)操作,使用timestamp作为score,event id(或者整个event json)作为member。
ZADD my-set-key timestamp event-id
然后使用 zrevrange 命令获取页面最新项目。如果您选择使用事件 ID 作为成员,那么您需要额外的结构来存储事件字段。我会推荐 HSET eventid、field、value。
2:可以通过成员(event-id)删除一个item
ZREM 我的设置 key 事件 ID
3: 假设你的 zset 只保持看不见,那么你可以使用 ZCARD 来获取集合的大小
ZCARD my-set-key
4:您可以使用一次删除整个集合
删除我的设置 key
5: 您可以使用 zrange/zrevrange 进行分页:
ZREVRANGE my-set-key start-position to-position
如果您需要同时保留可见和不可见的项目,那么您需要一个额外的 zset,您只在其中添加,但一旦看到项目就不要删除
关于redis - 我应该在 Redis 中为通知系统使用哪种数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37192363/