【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用户对象包含姓名,年龄,生日等信息

通过key(用户ID) + field(属性标签),就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

Redis hash是一个键值对集合。
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

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

常见命令
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的编码方式


结论
哈希对象保存的键值对数量小于 512个; 所有的键值对的健和值的字符串长度都小于等于 64byte (一个英文字母一个字节)时用ziplist,反之用hashtable; 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的编码方式



结论
哈希对象保存的键值对数量小于 512个; 所有的键值对的健和值的字符串长度,都小于等于 64byte (一个英文字母一个字节时用listpack,反之用hashtable listpack升级到Hashtable可以,反过来降级不可以
命令案例
1.hset/hget/hmset/hmget/hgetall/hdel

2.hlen
获取某个key内的全部数量

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

4.hkeys/hvals
hkeys key 查询出所有key对应的子key值
hvals key 查询出所有key对应的子key的value值

5.hincrby/hincrbyfloat

6.hsetnx
不存在赋值,存在了无效


浙公网安备 33010602011771号