redis - 我应该在 Redis 中为通知系统使用哪种数据结构?

标签 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 条通知,但他可以单击下一步按钮并查看接下来的 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/

相关文章:

php - redis和php的问题

使用 ServiceStack 在分布式环境中订阅 Redis 键空间通知

node.js - NodeJS Socket.io Server<-->服务器通信

python - 在 python 中设置 Redis 循环?

redis - Redis崩溃而没有任何日志错误

database - 如何通过 Node.js 为 Redis 数据库发出 HGET/GET 命令?

php - 无法找到软件包 php5-redis Ubuntu 14.04

c# - 字典c#的算术运算

redis - Redis 上的 Mysql 类型限制函数

c# - 如何使用多线程 C# 应用程序在 Redis 中插入数百万个键/值