Redis---Hash

哈希常用的命令复习
命令 功能
hset key field value 设置哈希值
hsetnx 设置哈希值,field或键必须不存在
hget 获取某个file对应的值
hdel 删除一个或多个field-value
hlen 计算field的个数
hmset 批量设置field-value
hmget 批量获取field-value
hexists 判断某个field是否存在
hkeys 获取所有的field
hvals 获取所有的value
hgetall 获取所有的field-value
hincrby 自增整数
hincrbyfloat 自增浮点数
hstrlen  计算value字符串的长度

 

 

 

 

 

 

 

 

 

 

 

 

 

几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。

在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}},

Redis键值对和哈希类型二者的关系可以用下图来表示:

注意:哈希类型中的映射关系叫做field-value,注意这里的value是指field对应的值,不是键对应的值,一定要注意value在不同上下文的作用。

下面介绍一些哈希常用的命令。

1)设置值

命令:hset key field value

127.0.0.1:6379> hset user:1 name kebi
(integer) 1
127.0.0.1:6379> hset user:1 age 26
(integer) 1

如果设置成功会返回1,反之会返回0。

此外Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。

复制代码
127.0.0.1:6379> hexists user:1 name
(integer) 1    #user:1 name存在
127.0.0.1:6379> hsetnx user:1 name xiaoniao
(integer) 0    #没有设置成功
127.0.0.1:6379> hget user:1 name
"kebi"
127.0.0.1:6379> hsetnx user:4 name xiaoniao
(integer) 1
127.0.0.1:6379> hget user:4 name
"xiaoniao"  #field不存在才行
复制代码

 

2)获取值

命令:hget key field

127.0.0.1:6379> hget user:1 name
"kebi"
127.0.0.1:6379> hget user:1 dorm
(nil)

如果键的field不存在或者或键本身就不存在,会返回nil。

 

3)删除field

命令:hdel key field [field ...]

hdel会删除一个或多个field,返回结果为成功删除field的个数:

复制代码
127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hdel user:1 name
(integer) 1
127.0.0.1:6379> hkeys user:1
1) "age"
2) "sex"
复制代码

注意如果要删除键,还是使用del:

127.0.0.1:6379> del user:1
(integer) 1
127.0.0.1:6379> exists user:1
(integer) 0

并没有说能单独删除哈希的value,因为没有意义。

 

4)计算field的个数

命令:hlen key

复制代码
127.0.0.1:6379> hset user:1 name kebi
(integer) 1
127.0.0.1:6379> hset user:1 age 26
(integer) 1
127.0.0.1:6379> hset user:1 sex boy
(integer) 1
127.0.0.1:6379> hlen user:1
(integer) 3
复制代码

 

5)批量设置或获取field-value

命令:

hmget key field [field ...]
hmset key field value [field value ...]

hmset和hmget分别是批量设置和获取field-value,hmset需要的参数是key和多对field-value,hmget需要的参数是key和多个field:

复制代码
127.0.0.1:6379> hmget user:1 name age sex
1) "kebi"
2) "26"
3) "boy"
127.0.0.1:6379> hmset user:2 name maoxian age 25 sex boy
OK
127.0.0.1:6379> hmget user:2 name age sex
1) "maoxian"
2) "25"
3) "boy"
复制代码

 

6)判断field是否存在

命令:hexists key field

127.0.0.1:6379> hexists user:1 name
(integer) 1
127.0.0.1:6379> hexists user:1 dorm
(integer) 0

如果field存在,返回结果为1,如果不存在返回0.

 

7)获取所有的field

命令:hkeys key

hkeys命令应该叫hfields更为恰当,它返回指定哈希键所有的field:

复制代码
127.0.0.1:6379> keys *  #返回所有的键
1) "user:2"
2) "user:1"
127.0.0.1:6379> hkeys user:1 #返回键user:1所有的field
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hkeys user:2
1) "name"
2) "age"
3) "sex"
复制代码

 

8)获取所有value

命令:hvals key

复制代码
127.0.0.1:6379> hvals user:1
1) "kebi"
2) "26"
3) "boy"
127.0.0.1:6379> hvals user:2
1) "maoxian"
2) "25"
3) "boy"
复制代码

 

9)获取所有的field-value

命令:hgetall key

复制代码
127.0.0.1:6379> hgetall user:1
1) "name"
2) "kebi"
3) "age"
4) "26"
5) "sex"
6) "boy"
复制代码

注意:在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能。

  如果只需要获取部分field,可以使用hmget,如果一定要回去全部的field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。

 

10)hincrby hincrbyfloat

命令:

hincrby key field
hincrbyfloat key field

hincrby和hincrbyfloat命令一样,但是它们的作用域是field。

 

11)计算value的字符长度(需要Redis3.2版本以上)

命令:hstrlen key field

 

下面提供一张哈希类型命令的时间复杂度,可以根据自身的需求选择合适的命令。

哈希类型命令的时间复杂度
命令                             时间复杂度
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 field [field ...] O(k),k是field个数
hmset 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)

 

 
 
posted @ 2019-04-11 16:16  crazy_boy  阅读(346)  评论(0编辑  收藏  举报