背景:redis中存储数据采取key-value键值对的形式,而hash内部也是键值对,为了区别这两个东西,hash内部的键值对称为:field-value,而redis的为key-value,这里的value包括:field-value。
对于hash类型的命令和String很像,大多数是在前面加上h,表示hash的意思
1.命令小结
命令 | 含义 | 时间复杂度 |
---|---|---|
hset key field value | 设置值 | O(1) |
hget key field | 获取值 | O(1) |
hdel key field [field ...] | 删除field | O(n) |
hlen key | 计算field个数 | O(1) |
hgetall field [field ...] | 获取所有的field-value | O(n) |
hmget field [field ...] | 批量获取field-value | O(n) |
hexists key field | 判断field是否存在 | O(1) |
hkeys key | 获取所有的field | O(n) |
hvals key | 获取所有的value | O(n) |
hsetnx key field value | 设置field值,field不存在时成功 | O(1) |
hincrby key field n | 对应field-value+n | O(1) |
hincrbyfloat key field n | 对应field-value+n(浮点数版) | O(1) |
hstrlen key field | 计算value的字符串长度 | O(1) |
2.hash命令详解
(1)hset
语法:hset key field value [field value ......]
含义:设置键值对
返回值:设置成功后的field-value键值对的个数
时间复杂度:O(N),N为插入的个数

(2)hget
语法:hget key field
返回值:返回field对应的value,每次只能获取一个
时间复杂度:O(1)


(3)hexists
语法:hexists key field
含义:判断hash中指定的字段是否存在
返回值:1表示存在,0表示不存在
时间复杂度:O(1)

(4)hdel
语法:hdel key field [field ...]
含义:删除hash中指定的字段(删除的是field而不是key)
返回值:成功删除的field个数
时间复杂度:O(N),N为删除field的个数

(5)hkeys
语法:hkeys key
含义:获取hash中所有的field
时间复杂度:O(N),N为field的个数

(6)hvals
语法:hvals key
含义:返回所有的value(field对应的value)
时间复杂度:O(N),N为value的个数

(7)hgetall
语法:hgetall key
含义:获取hash中所有的field-value
时间复杂度:O(N),N为field的个数

(8)hmget
语法:hmget key field [field ...]
含义:返回hash中指定的field(可以同时查询多个field)
时间复杂度:O(N),N为查询field的个数

(9)hlen
语法:hlen key
含义:返回key对应的hash中所有字段的个数(field个数)
时间复杂度:O(1)
存在个数:

不存在:

(10)hsetnx
语法:hsetnx key field value
含义:在field不存在的时候才能设置成功
返回值:1表示设置成功,0表示失败
时间复杂度:O(1)

(11)hincrby
语法:hincrby key field increment
含义:将hash中指定字段对应的数值添加指定的值
时间复杂度:O(1)

(12)hincybyfloat
语法:hincybyfloat key field increment
含义:将hash中指定字段对应的数值添加指定的值(浮点数版本)
时间复杂度:O(1)

(13)hstrlen
语法:hstrlen key field
含义:计算value的字符串长度
时间复杂度:O(1)

3.hash编码方式
哈希内部编码的方式有两种:ziplist和hashtable。
(1)ziplist(压缩列表)
含义:两种情况都满足,redis就会采取该种编码方式。第一种:元素个数小于一定值(默认hash-max-ziplist-entries为512个)第二种:hash中所有的value值小于一定字节(hash-max-ziplist-value默认为64字节),同时满足才会采取ziplist编码方式。这种编码方式会更加的节省内存

(2)hashtable(哈希表)
下面让hash中的value过长,看一下hashtable的编码方式
