【问题标题】:Redis - Option for storing multiple objectsRedis - 存储多个对象的选项
【发布时间】:2021-06-22 21:25:39
【问题描述】:

当我们需要存储多个相同类别的对象时,redis 的最佳实践是什么?

目前我将整个对象存储为 json 字符串。

例如:书籍。

{
   title:...,
   author:...
}

选项 1:

set book:1 book1
set book:2 book2
set book:3 book3

用法:get book:1 会给我书籍对象。

选项 2:散列

hset book 1 book1
hset book 2 book2
hset book 3 book3

用法:hget book 1 会给我整本书的对象

在性能或使用等方面有什么巨大差异吗? 如果您想到任何其他方法,请分享!

【问题讨论】:

    标签: redis redisson


    【解决方案1】:

    用于存储 JSON 对象的字符串与哈希

    Hashes和Strings的大部分相关操作在时间复杂度上是等价的(GET/HGET/MGET/HMGET/SET/HSET)。使用字符串(GET/SET)的唯一缺点是,如果您担心在SCANKEYS 命令在整个键空间(Redis 中的每个键)上操作时能够扫描整套书籍 -即使您的模式是books:*,Redis 仍然需要遍历所有键。而HSCANHGETALL 仅对哈希进行操作。换句话说,如果您在 Redis 中存储大量内容,并且希望能够遍历所有书籍,那么 HASH 可以为您节省一些时间。

    在 Redis 中存储 JSON

    你在 cmets 中问过一个问题,存储 JSON 是不是不好的做法,它肯定没有什么问题,而且很常见,使用 JSON 的唯一缺点是你只能 GET/SET 整个字符串,而且每次您从 Redis 中提取数据,您的应用程序必须将 JSON 中的数据编组并序列化回 JSON,只要您想将更新发送到数据库。如果这是一个问题,可以通过 RedisJson 模块解决,但这是一个完全独立的主题。

    【讨论】:

    • 你是说每个对象都应该是一个单独的哈希值!?我已经更新了我的问题。请检查。
    • 准确地说,如果您使用选项 2,则每本书的实例都将作为散列单独存储在其自己的键下,因此您的键空间将 O(n),其中 n 是书籍的数量。如果您使用扁平字符串(选项 1)执行此操作,则每个 FIELD 都将存储在它自己的键下,因此您的键空间将为 O(n*m) 其中 n 仍然是书籍的数量,而 m 是您的字段数'正在指定..
    • 你太混乱了。我不是在谈论对象的各个字段。我将整个对象存储为二进制字符串/ json 字符串。这是不好的做法吗!?
    • 抱歉,从您的第一次编辑中并不清楚您将所有内容存储在 JSON 中 - 听起来您要将每本书的每个字段存储在一个单独的键中,这是我的原始答案注定要使用哈希。如果这对您来说是一个可用的解决方案,我可能会决定将每个密钥作为 JSON 对象存储在自己的密钥中。看我的回答。
    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2019-08-16
    • 2013-02-19
    • 2015-12-08
    相关资源
    最近更新 更多