我应该在Redis中使用哪种数据结构来建立通知系统?

时间:2016-05-12 16:15:17

标签: redis

我正在尝试使用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个通知,但是他可以单击下一个按钮查看下一个按钮,然后查看下一个按钮,依此类推。

我不知道如何在Redis上完成所有这些工作。

列表或集合的键可以是user:1:notification。我知道列表已经排序,我们可以添加和删除头部和尾部。但是我如何实现所有这些要点呢?

1 个答案:

答案 0 :(得分:1)

1:您可以使用redis排序集(zset)操作并使用时间戳作为分数,并使用事件ID(或整个事件json)作为成员。

ZADD my-set-key timestamp event-id

然后,为了获得页面最新的项目,您使用zrevrange命令。如果您选择将事件ID用作成员,则需要其他结构来存储事件字段。我会推荐HSET eventid,field,value。

2:您可以按成员(event-id)删除项目

ZREM my-set-key event-id

3:假设您的zset只能看不见,那么您可以使用ZCARD获取该组的大小

ZCARD my-set-key

4:您可以使用

一次删除整个集

删除my-set-key

5:您可以使用zrange / zrevrange进行分页:

ZREVRANGE my-set-key开始位置到位置

如果您需要同时保留已查看和未看到的项目,那么您只需要添加一个额外的zset,但是一旦看到项目就不要删除