背景: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的编码方式