开发者如果想把 json 格式的 payload 数据存储至 redis,有两种数据结构可以选择,一种是可以把数据包装成 json 字符串形式存储成 strings 结构,另一种是把 payload 的每个字段及字段值存储成 hashes 结构的 field 和 value。
string vs hash 如何选择
SET user:1 "{\"name\":\"john\",\"location\":\"NY\",\"salary\":50000}"
选择 string 结构的场景:
- 如果你会用到 json 数据的绝大多数字段(fields)时;
- 如果 json 数据不会高频率更新;
- 如果对应数据比较大;
HSET user:1 name john
HSET user:1 location NY
HSET user:1 salary 50000
选择 hash 结构的场景:
- 如果你主要使用 json 数据的单个字段(single field)时;
- 如果 json 数据的某些字段高频率更新时;
- 如果对应存储数据不是很大时,hash 采用 ziplist 的压缩结构,空间占用和 string 一样;
hash 结构的 ziplist
当 hash 结构的 field 和 value 满足如下条件时,redis 针对 hash 结构采用 ziplist 编码方式,该编码是压缩列表相比 hashtable 节省很多空间:
- 哈希对象保存的所有键值对的键和值的字符串长度都小于设置的阈值(默认:64 字节)时;
- 哈希对象保存的键值对数量小于指定阈值(默认:512 个)时;
上述两项的阈值通过 redis 配置文件可以修改;
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
当数据满足 hash 结构的 ziplist 编码方式时,hash 结构存储的数据占空间与 string 结构的基本相同。