Redis学习笔记【05】 - 哈希

一、简介

几乎所有的语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}},Redis键值对和哈希类型二者的关系可以如下图表示:

Redis学习笔记【05】 - 哈希_第1张图片

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开发与运维》 付磊 & 张益军

你可能感兴趣的:(Redis学习笔记【05】 - 哈希)