如何根据 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 数组