我已经阅读了 Redis 文档和所有内容,但无法理解这个用例。
我有以下数据结构
=> title
=> content
=> date
=> score
=> id
并且只需要将 title
和 date
存储在一个排序集中,我在每次创建主要帖子时都会这样做。
问题在于我也必须删除排序集上的内容,因为如果我这样做了
zadd 10 [title, date]
其中 10
是 score
,如果还有另一篇文章,我想删除它score
10
两者都会被删除,这不是我想要的功能,显然是这样。
我考虑过将帖子 id
添加到分数之前,例如 6+10
=> 610
但它会搞砸设置订购并弄得一团糟。附加它更加麻烦,不可维护,更不用说非常低效了。
最后一点,我使用排序集是因为我存储了 360.000.000 多个项目,而当我必须访问中间的项目时,其他集将失败。
我该如何解决这个问题(删除安全地存储排序集中的部分哈希集副本)?
最佳答案
您可以使用 lua 脚本。由于redis是单线程的,lua执行时,不会并发执行其他查询(悲观锁)。
在您的 lua 脚本(EVAL 命令)中,您将元素存储在您想要添加的分数处(在您使用 ZRANGEBYSCORE 的示例中为 10)。使用 ZREMRANGEBYSCORE 从 redis 中删除该分数的所有元素。在redis中用ZADD把lua中存储的元素加回来。
您使用 lua 运行时作为您处理的内存缓冲区。它应该工作得很好,因为它是事务性的。
关于sorting - 将部分散列集副本存储在有序集中的删除安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25500094/