Redis学习笔记【05】 - 哈希
一、简介
几乎所有的语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}},Redis键值对和哈希类型二者的关系可以如下图表示:
Tip:哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值,请注意value在不同上下文的作用。
二、命令
1、设置值
hset key field value
下面为user:1添加一对于field-value:
127.0.0.1:6379> hset user:1 name nosee
(integer) 1
如果设置成功会返回1,反之会返回0。此外Redis提供了hsetnx
命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。
2、获取值
hget key field
如:
127.0.0.1:6379> hget user:1 name
"nosee"
如果field不存在则会返回nil:
127.0.0.1:6379> hget user:2 name
(nil)
127.0.0.1:6379> hget user:1 age
(nil)
3、删除field
hdel key field [field ...]
hdel会删除一个或多个field,返回结果为成功删除field的个数,如:
127.0.0.1:6379> hdel user:1 name
(integer) 1
127.0.0.1:6379> hdel user:1 age
(integer) 0
4、计算field个数
hlen key
如:
127.0.0.1:6379> hset user:1 name nosee
(integer) 1
127.0.0.1:6379> hset user:1 age 17
(integer) 1
127.0.0.1:6379> hset user:1 city shenzhen
(integer) 1
127.0.0.1:6379> hlen user:1
(integer) 3
5、批量设置或获取filed-value
hmget key field [field ...]
hmset key field value [field value ...]
如:
127.0.0.1:6379> hmset user:1 name nosee age 27 city HK
OK
127.0.0.1:6379> hmget user:1 name city
1) "nosee"
2) "HK"
6、判断filed是否存在
hexists key field
例如,user:1包含name域,所以返回结果1,不包含sex域所以返回0:
127.0.0.1:6379> hexists user:1 name
(integer) 1
127.0.0.1:6379> hexists user:1 sex
(integer) 0
7、获取所有filed
hkeys key
如:
127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"
3) "city"
8、获取所有value
hvals key
如:
127.0.0.1:6379> hvals user:1
1) "nosee"
2) "27"
3) "HK"
9、获取所有field-value
hgetall key
如:
127.0.0.1:6379> hgetall user:1
1) "name"
2) "nosee"
3) "age"
4) "27"
5) "city"
6) "HK"
Tip:在使用 hgetall
时,如果哈希元素个数比较多,会存在阻塞Redis的可能。如果开发人员只需要获取部分field,可以使用hmget
,如果一定要全部获取field-value,可以使用 hscan
命令,该命令会渐进式遍历哈希类型,hscan将在后面章节介绍。
10、hincrby hincrbyfloat
hincrby key field increment
hincrbyfloat key field increment
hincrby和hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是field,如:
127.0.0.1:6379> hget user:1 age
"27"
127.0.0.1:6379> hincrby user:1 age 2
(integer) 29
127.0.0.1:6379> hincrbyfloat user:1 age 0.5
"29.5"
11、计算value的字符串长度(需要Redis3.2以上)
hstrlen key field
如:
127.0.0.1:6379> hget user:1 name
"nosee"
127.0.0.1:6379> hstrlen user:1 name
(integer) 5
三、哈希类型命令时间复杂度
命令 | 时间复杂度 |
---|---|
hset key field value | O(1) |
hget key field | O(1) |
hdel key field [field ...] | O(k),k是field的个数 |
hlen key | O(1) |
hgetall key | O(n),n是field的总数 |
hmget key field [field ...] | O(k),k是field的个数 |
hmset key field value [field value ...] | O(k),k是field的个数 |
hexists key field | O(1) |
hkeys key | O(n),n是field的总数 |
hvals key | O(n),n是field的总数 |
hsetnx key field value | O(1) |
hincrby key field increment | O(1) |
hincrbyfloat key field increment | O(1) |
hstrlen key field | O(1) |
参考:
《Redis开发与运维》 付磊 & 张益军