Redis 基础教程

Redis 命令

Redis 高级教程

Redis 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/redis-strings-vs-hashes-to-represent-json-efficiency.html

Redis 存储 json 格式的 payload 数据,选择 string 还是 hash 数据结构

Redis 笔记 Redis 笔记


开发者如果想把 json 格式的 payload 数据存储至 redis,有两种数据结构可以选择,一种是可以把数据包装成 json 字符串形式存储成 strings 结构,另一种是把 payload 的每个字段及字段值存储成 hashes 结构的 field 和 value。

string vs hash 如何选择

SET user:1 "{\"name\":\"john\",\"location\":\"NY\",\"salary\":50000}"

选择 string 结构的场景:

  1. 如果你会用到 json 数据的绝大多数字段(fields)时;
  2. 如果 json 数据不会高频率更新;
  3. 如果对应数据比较大; 
HSET user:1 name john
HSET user:1 location NY
HSET user:1 salary 50000

选择 hash 结构的场景:

  1. 如果你主要使用 json 数据的单个字段(single field)时;
  2. 如果 json 数据的某些字段高频率更新时;
  3. 如果对应存储数据不是很大时,hash 采用 ziplist 的压缩结构,空间占用和 string 一样;

hash 结构的 ziplist

当 hash 结构的 field 和 value 满足如下条件时,redis 针对 hash 结构采用 ziplist 编码方式,该编码是压缩列表相比 hashtable 节省很多空间:

  1. 哈希对象保存的所有键值对的键和值的字符串长度都小于设置的阈值(默认:64 字节)时;
  2. 哈希对象保存的键值对数量小于指定阈值(默认:512 个)时;

上述两项的阈值通过 redis 配置文件可以修改;

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

当数据满足 hash 结构的 ziplist 编码方式时,hash 结构存储的数据占空间与 string 结构的基本相同。