Redis - 用于存储多个对象的选项

问题描述

当我们需要存储同一类别的多个对象时,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 会给我整本书的对象

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

解决方法

String vs Hash 用于存储 JSON 对象

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

在Redis中存储JSON

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