【Redis】数据类型:Hash

3.redis哈希表(Hash)

Redis Hash是一个string类型的field(字段)和value(值)的映射表,Hash特别适合用户存储对象。

Redis中,每个Hash可以存储2^32-1个键值对(40多亿)

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

类似Java里面的Map<String,Object>。

用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息

img
img

通过key(用户ID) + field(属性标签),就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

img
img

Redis hash是一个键值对集合。

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

img
img

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

img
img

常见命令

hset <key><field><value>		给<key>集合中的  <field>键赋值<value>
hget <key1><field>		      从<key1>集合<field>取出 value 
hmset <key1><field1><value1><field2><value2>		批量设置hash的值
HMGET:									批量获取多个hash类型key的field的值
HGETALL:								获取一个hash类型的key中的所有的field和value
hexists<key1><field>		查看哈希表 key 中,给定域 field 是否存在。 
hkeys <key>					列出该hash集合的所有field
hvals <key>					列出该hash集合的所有value
hincrby <key><field><increment>		为哈希表 key 中的域 field 的值加上增量 1   -1
hsetnx <key><field><value>				将哈希表key中的域field的值设置为value,当且仅当域field不存在

数据结构

Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。

当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。

KV模式不变,但V是一个键值对 Map<String, Map<Object, Object>>

Hash的两种编码格式

Redis6以前:ziplist、Hashtable

Redis7:listpack、Hashtable

Redis6

hash-max-ziplist-entries:使用压缩列表保存时哈希集合中的最大元素个数。

hash-max-ziplist-value:使用压缩列表保存时哈希集合中单个元素的最人长度。

Hash类型键的字段个数, 小于 hash-max-ziplist-entries ,并且每个字段名和字段值的长度, 小于 hash-max-ziplist-value 时,Redis才会使用 OBJ_ENCODING_ZIPLIST来存该键,前述条件任意一个不满足,则会转换为 OBJ_ENCODING_HT的编码方式

img
img
img
img

结论

  1. 哈希对象保存的键值对数量小于 512个;
  2. 所有的键值对的健和值的字符串长度都小于等于 64byte (一个英文字母一个字节)时用ziplist,反之用hashtable;
  3. ziplist升级到hashtable可以,反过来降级不可以;即一旦从压缩列表转为了哈希表,Hash类型就会一直用哈希表进行保存而不会再转回压缩列表了。在节省内存空间方面哈希表就没有压缩列表高效了。

Redis7

hash-max-listpack-entries:使用压缩列表保存时,哈希集合中的最大元素个数。

hash-max-listpack-value:使用压缩列表保存时,哈希集合中单个元素的最人长度。

Hash类型键的字段个数 小于 hash-max-listpack-entries,且每个字段名和字段值的长度 小于 hash-max-listpack-value 时,Redis才会使用OBJ_ENCODING_LISTPACK来存储该键,前述条件任意一个不满足,则会转换为 OBI_ENCODING_HT的编码方式

img
img
img
img
img
img

结论

  1. 哈希对象保存的键值对数量小于 512个;
  2. 所有的键值对的健和值的字符串长度,都小于等于 64byte (一个英文字母一个字节时用listpack,反之用hashtable
  3. listpack升级到Hashtable可以,反过来降级不可以

命令案例

1.hset/hget/hmset/hmget/hgetall/hdel

img
img

2.hlen

获取某个key内的全部数量

img
img

3.hexists key 在key里面的某个值的key

img
img

4.hkeys/hvals

hkeys key 查询出所有key对应的子key值

hvals key 查询出所有key对应的子key的value值

img
img

5.hincrby/hincrbyfloat

img
img

6.hsetnx

不存在赋值,存在了无效

img
img
posted @ 2026-06-09 10:29  青柠代码录  阅读(3)  评论(0)    收藏  举报