如何根据 json 文件从 Redis 排序集中删除项目

Posted

技术标签:

【中文标题】如何根据 json 文件从 Redis 排序集中删除项目【英文标题】:How to remove item from Redis sorted set based on json filed 【发布时间】:2022-01-15 07:10:59 【问题描述】:

我正在使用 redis 来设计用户时间线(如在 tweeter 中)。我正在使用排序集来存储带有时间戳的 json 值作为分数

 zrange feed:user:10000001 0 10 WITHSCORES
 1) "\"postId\":10000411,\"userId\":10000001"
 2) "1639073241754"
 3) "\"postId\":10000412,\"userId\":10000002"
 4) "1639073241748"

当用户 A 取消关注 B 时,如何从用户 A 的时间线中删除用户 B 的所有帖子?

由于在排序集(和 redis)中不支持查询 json 数据,因此对 SO 的其他响应建议将 json 值存储在以 postId 作为子键的哈希中,并将 postId 作为排序集中的值存储。但是然后我在哪里存储userId 以在基于它的删除时查找它?如何实现此功能?

【问题讨论】:

【参考方案1】:

我认为您应该彻底重构存储数据的方式。我建议这样:

    有一组已排序的 feed:user:userId,仅存储 postId。 拥有一组user:post:userId,其中存储了一组用户的postId

所以为了“从用户A的时间轴中删除用户B的所有帖子”,您需要首先执行redis> SMEMBERS user:post:userBId之类的查询,以检索所有B的postId并将其存储到变量“results”和然后执行这个命令ZREM feed:user:userAId results

【讨论】:

优秀。这解决了我的用例。但是,如果用户 b 有大量帖子,如果用户 b 有大量帖子,这是否会导致问题,因为我们只需要删除用户 B 在用户 A 时间轴上的帖子(比如 10-15),而不是用户 B 的每个帖子(比如100-1000) @Annon 一般不会! (实际上我在一个类似的应用程序上工作,我们像这样对待)但是如果你已经将用户的帖子存储在任何地方,比如 postgresql 表,你可以检索 userB 的帖子 id 并从那里填写results。我的意思是要存储用户的时间线,您只需要帖子 ID,不需要其他任何内容。

以上是关于如何根据 json 文件从 Redis 排序集中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

SQL JSON PATH 如何在从较大的 json 集中提取后按索引访问 json 数组

如何根据请求从 JS 文件发送 JSON 响应?

如何根据数据集中的行长过滤 RDD。?

redis 如何存一个PHP数组 代码怎么写呢

根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存

Linux json文件(排序去重)