问题描述
当我们需要存储同一类别的多个对象时,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)的唯一缺点是,如果您担心能够扫描整个书籍集,因为 SCAN 和 KEYS 命令在整个键空间(每个键在 Redis 中) - 即使您的模式是 books:*
,Redis 仍然需要遍历所有键。而 HSCAN 和 HGETALL 仅对哈希进行操作。换句话说,如果您在 Redis 中存储了大量内容,并且希望能够遍历所有书籍,那么 HASH 可以为您节省一些时间。
在Redis中存储JSON
您在评论中问了一个问题,存储 JSON 是否是不好的做法,它绝对没有错,而且很常见,使用 JSON 的唯一缺点是您只能 GET/SET 整个字符串,并且每次当您从 Redis 中提取数据时,您的应用程序必须从 JSON 中编组数据并将其序列化回 JSON,只要您想将更新发送到数据库。如果这是一个问题,可以通过 RedisJson 模块解决,但这是一个完全独立的主题。