【问题标题】:Delete from Redis Sorted Set based on JSON Property基于 JSON 属性从 Redis 排序集中删除
【发布时间】:2015-08-27 16:51:01
【问题描述】:

我有大量存储在 Redis 排序集中(大约 100,000 个)的项目,这些项目相当频繁地更新。这些项目是编码为 JSON 字符串的对象,集合中的排序排名是从对象的日期/时间属性派生的(在插入时,由我的代码)。

集合中的每个项目都有一个 Id 属性(它是一个编码为字符串的 Guid),它唯一地标识系统中的项目。

更新这些项目时,我需要更新排序集中的项目,或者删除并重新插入该项目。我遇到的问题是如何找到该项目来执行操作。

我目前正在做的是将排序集的全部内容加载到内存中,在我的代码中对该集合进行操作,然后将完整的集合写回 Redis。虽然这很有效,但它并不是特别有效,并且如果列表开始变得非常大,则无法很好地扩展。

有人对如何以更有效的方式执行此操作有任何建议吗?我拥有的项目唯一唯一标识符是项目中编码的 Id 属性。

非常感谢,

理查德。

【问题讨论】:

    标签: json redis sortedset


    【解决方案1】:

    可能,您的案例只是一个糟糕的设计选择。

    您不应该将 JSON 字符串存储在排序集中:您需要存储标识符,并且整个 JSON 序列化对象应该存储在 hash 中。

    这样,当您需要更新一个对象时,您可以使用hset 更新整个哈希键,并且您可以通过其唯一标识符来定位整个对象。

    另一方面,散列中的任何键都必须存在于您的排序集中。当您将对象添加到排序集中时,您将添加其唯一标识符。

    当您需要按特定顺序列出对象时,请执行以下操作:

    1. 您会从排序集中获得一页标识符(例如,使用 zrange)。
    2. 您可以从页面中获取所有对象,并将其标识符提供给 hmget 命令。

    【讨论】:

    • 建议使用哈希存储 ID->JSON 数据,但不是强制性的,因为您可以使用字符串将每个 ID 的 JSON 存储在其自己的密钥下。也就是说,由于 Redis 的每个键开销,哈希在 RAM 方面更可取。
    • @ItamarHaber 嘿,怎么样? ;) 是的,我一直在使用字符串键方法,直到我意识到 hases 更好,这不仅是因为内存优化,而且还因为当你可以将它们组织在子键中时,谁想要一个被数百万键污染的全局键空间
    • @ItamarHaber 好吧,你是对的......这就是我的情况,我使用哈希通过一些“关键属性”来存储序列化对象,然后我需要通过一些标准来获取它们.这就是为什么我倾向于使用散列排序集(或只是一个集、列表或其他)方法的原因。
    • 你说得对,这是一个糟糕的设计选择——我来自 SQL 世界,这是我用 Redis 编写的第一件事。我不会再这样做了,我认为现在是按照@MatíasFidemraizer 建议的方式重新实施的时候了。
    • @RichardComish 好吧,你会发现,一旦你习惯了使用简单的数据结构,SQL 会让你感到一团糟;P
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2015-08-12
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2021-08-17
    相关资源
    最近更新 更多