value类型为hash类型
H系列的命令,必须要保证value得是hash类型
如图所示:

HSET
设置value为hash类型的键值对
操作格式:
hset key field value field value...
举个例子:
cpp
//对key1的value设置多组键值对
hset key1 f1 111 f2 222 f3 333
返回值:
设置成功的键值对个数
HGET
操作格式:
hget key field
返回值:
该field对应的value,找不到返回空(nil)
HEXISTS
操作格式:
hexists key field
返回值:
1表示存在,0表示不存在
举个例子:
cpp
//设置一个键值对
hset key1 field1 value1
//查找field对应的value
hexists key1 field1
HDEL
删除hash中的指定字段
注意:
del删除的是key
hdel删除的是field
操作格式:
hdel key field field...
返回值:
本次操作删除字段的个数
举个例子:
cpp
hset key1 field1 value1
hdel key1 field1
HKEYS
获取hash中key对应的所有field字段
操作格式:
hkeys key
举个例子:
cpp
hset key1 field1 value1
hkeys key1
时间复杂度:
O(N),N为key设置的field的个数,这种情况我们可以将其看作O(1)
HVALUES
获取hash中key对应的所有value字段
操作格式:
hvalues key
举个例子:
cpp
hset key1 field1 values1
hvalues key1
时间复杂度:
O(N)
注意:
hkeys/hvalues如果查询到的数据量过大,可能导致redis长时间执行不完该命令,导致阻塞其它请求,进而导致大量请求去请求mysql,导致搞崩溃mysql,与keys *差不多
HGETALL
获取该key对应的全部field和value
HMGET
一次查询多个field
操作格式:
hmget field field...
hekeys,hvalues,hgetall均存在一定风险,可能将服务器搞崩,想要全部遍历更推荐hscan
HSCAN
它属于渐进式遍历,意思是敲一次,遍历一小部分,多敲几次,也可以遍历完全部数据
HLEN
获取values对应的哈希结构,存储多少个元素
操作格式:
hlen key
时间复杂度:
O(1),因为拿取个数时,是不需要遍历的,而是选择,存储其现有个数,并将其返回,所以时间复杂度是O(1)
举个例子:
cpp
hset key1 f1 111 f2 222 f3 333
hlen key1
HSTENX
类似于stenx,不存在的时候才能设置成功,如果存在则失败
HINCRBY/HINCRBYFLOAT
hincrby增加n个整数,hincrbyfloat增加n个小数
注意:
value为hash类型,并没有提供incr,decr等
操作格式:
hincrby key field number
举个例子:
cpp
hset key1 field1 10
hincrby key1 field1 -10
时间复杂度:
O(1)
哈希编码方式
**ziplist(压缩列表):**当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值大小都小于hash-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省空间方面上比hashtable更加优秀
**hashtable:**正常的哈希结构
压缩的本质:
压缩的本质就是对数据仅从重新的编码
不同的数据,有不同的特点,在进行精妙的设计后,重新编码,就能够缩小体积
举个例子:
对abbcccddddeeeee重新编码1a2b3c4d5e
ziplist也是同理,内部数据结构也是经过精心设计的
所以在哈希中,元素个数比较少,value的值长度都比较短的情况下会使用ziplist结构
修改这两个配置文件,hash-max-ziplist-entries/hash-max-ziplist-value,可以修改大小为多少在进行容器的切换
这部分知识在进行比较精细的调优工作时还是比较有意义的
使用场景
1.可以存储一些表结构
