1 简介
- Redis hash 是一个键值对集合。
- Redis hash是一个string类型的field和value的映射表,
- hash特别适合用于存储对象。
- 类似Java里面的Map<String,Object>
- 用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
主要有以下2种存储方式:
1.1 采用序列化对象存储(例如Json)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021042922170131.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYwMTAwMQ==,size_16,color_FFFFFF,t_70)
- 每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大。
1.2 采用id+属性作为key存储
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210429221741606.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYwMTAwMQ==,size_16,color_FFFFFF,t_70)
1.3 使用Hash存储
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210429222240737.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYwMTAwMQ==,size_16,color_FFFFFF,t_70)
- 通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426214728452.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYwMTAwMQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426223937875.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYwMTAwMQ==,size_16,color_FFFFFF,t_70)
2 常用命令
hset <key><field><value>
hget <key1><field>
hmset <key1><field1><value1><field2><value2>...
- 查看哈希表 key 中,给定域 field 是否存在。
hexists<key1><field>
hkeys <key>
hvals <key>
- 为哈希表 key 中的域 field 的值加上增量 1 -1
hincrby <key><field><increment>
- 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
hsetnx <key><field><value>
3 数据结构
- Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。
- 当field-value长度较短且个数较少时,使用ziplist,
- 否则使用hashtable。