你必须非常努力,才能看起来毫不费力!
微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero !
前言
Redis Hash是 键-值
类型,值类型类似map结构,即 key-{{field1,value1},...,{fieldN,valueN}}
,更适合来保存对象。
比如我们要保存用户的个人信息,在String类型中,我们会把这个对象序列号为 JSON 字符串保存,这种方式方便存取而不方便更新,如果想要新增一个属性,就需要更新整个value;而使用Hash类型可以保存到属性粒度,新增和删除属性都比较方便。
Hash类型的命令都以H
开头,下面我们来系统学习下吧!
HSET
可用版本:>= 2.0.0
时间复杂度: O(N),N为field的个数
命令格式
HSET key field value [field value ...]
命令描述
- 将多个field-value保存到hash表中;
- 如果key不存在,将新建一个hash表;
- 如果key对应的hash表已经存在,且filed也已经存在,set将会覆盖。
返回值
添加成功的field数量
示例
127.0.0.1:6379> hset user:1 name lifelmy age 10
(integer) 2
127.0.0.1:6379> hget user:1 name
"lifelmy"
127.0.0.1:6379> hget user:1 age
"10"
HSETNX
可用版本:>= 2.0.0
时间复杂度: O(1)
命令格式
HSETNX key field value
命令描述
- key对应的field不存在时才会设置value;
- key对应的field存在时不会执行操作;
- key不存在时,新建一个hash表。
返回值
- 1 :field不存在,设置成功
- 0 :field已存在,未设置
示例
127.0.0.1:6379> HSETNX user:01 name lifelmy
(integer) 1
127.0.0.1:6379> HSETNX user:01 age 25
(integer) 1
# age field已经存在,不会设置
127.0.0.1:6379> HSETNX user:01 age 18
(integer) 0
127.0.0.1:6379> hget user:01 name
"lifelmy"
127.0.0.1:6379> hget user:01 age
"25"
HGET
可用版本:>= 2.0.0
时间复杂度: O(1)
命令格式
HGET key field
命令描述
key对应hash表中,返回filed对应value值。
返回值
- 字符串:field存在时对应的值
- nil: field不存在或key不存在
示例
127.0.0.1:6379> hset user:01 name lifelmy
(integer) 0
# field存在
127.0.0.1:6379> hget user:01 name
"lifelmy"
# field不存在
127.0.0.1:6379> hget user:01 gender
(nil)
# key不存在
127.0.0.1:6379> hget user:02 name
(nil)
HEXISTS
可用版本:>= 2.0.0
时间复杂度: O(1)
命令格式
HEXISTS key field
命令描述
返回key对应的hash表中,filed是否存在。
返回值
- 1:field存在
- 0: field不存在或key不存在
示例
127.0.0.1:6379> hset stu:01 name lifelmy
(integer) 1
127.0.0.1:6379> hexists stu:01 name
(integer) 1
127.0.0.1:6379> hexists stu:01 age
(integer) 0
HDEL
可用版本:>= 2.0.0
时间复杂度: O(N),N为给定field的数量
命令格式
HDEL key field [field ...]
命令描述
- 删除key对应的hash表中的filed;
- 如果field本身就不存在,删除时忽略该field;
- key不存在,直接返回0。
返回值
- 整数值:被删除的field个数(不包含不存在的field)
示例
127.0.0.1:6379> hset mykey field1 value1
(integer) 1
# field2不存在,返回0
127.0.0.1:6379> hdel mykey field2
(integer) 0
# field1存在,返回1
127.0.0.1:6379> hdel mykey field1 field2
(integer) 1
# key不存在
127.0.0.1:6379> hdel mykey1 field1
(integer) 0
HSTRLEN
可用版本:>= 3.2.0
时间复杂度: O(1)
命令格式
HSTRLEN key field
命令描述
返回key对应的hash表中,filed对应的value长度;
返回值
- 整数值:field对应的value长度,key或field不存在时返回0
示例
127.0.0.1:6379> hset user:001 name lifelmy
(integer) 1
# name field存在
127.0.0.1:6379> hstrlen user:001 name
(integer) 7
# field不存在
127.0.0.1:6379> hstrlen user:001 age
(integer) 0
# key不存在
127.0.0.1:6379> hstrlen user:111 name
(integer) 0
HLEN
可用版本:>= 2.0.0
时间复杂度: O(1)
命令格式
HLEN key
命令描述
返回key对应的hash表中,filed的个数;
返回值
- 整数值:hash表中field个数,key不存在时返回0
示例
127.0.0.1:6379> hset user:001 name lifelmy age 25
(integer) 2
127.0.0.1:6379> hlen user:001
(integer) 2
# key不存在
127.0.0.1:6379> hlen user:111
(integer) 0
HINCRBY
可用版本:>= 2.0.0
时间复杂度: O(1)
命令格式
HINCRBY key field increment
命令描述
- key对应的hash表中,将filed对应的value加上一个整数;
- 如果key不存在,创建hash表;
- 如果field不存在,创建field,对应value为0。
返回值
- 整数值:执行操作后value的值
示例
127.0.0.1:6379> hset user:01 cost 10
(integer) 1
127.0.0.1:6379> hincrby user:01 cost 2
(integer) 12
127.0.0.1:6379> hincrby user:01 cost -5
(integer) 7
# key不存在
127.0.0.1:6379> hincrby user:02 cost 2
(integer) 2
127.0.0.1:6379> hget user:02 cost
"2"
HINCRBYFLOAT
可用版本:>= 2.0.0
时间复杂度: O(1)
命令格式
HINCRBYFLOAT key field increment
命令描述
- key对应的hash表中,将filed对应的value加上一个浮点数;
- 如果key不存在,创建hash表;
- 如果field不存在,创建field,对应value为0;
- 可以参考INCRBYFLOAT操作。
返回值
- 字符串:执行操作后value值的字符串表示
- error: 旧值不是String类型 或者 不能转为浮点数类型
示例
127.0.0.1:6379> HSET mykey field 10.50
(integer) 1
127.0.0.1:6379> HINCRBYFLOAT mykey field 0.1
"10.6"
127.0.0.1:6379> HINCRBYFLOAT mykey field -5
"5.6"
127.0.0.1:6379> HSET mykey field 5.0e3
(integer) 0
127.0.0.1:6379> HINCRBYFLOAT mykey field 2.0e2
"5200"
HKEYS
可用版本:>= 2.0.0
时间复杂度: O(N),N为hash表的长度
命令格式
HKEYS key
命令描述
返回hash表中所有field
返回值
- field列表
示例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset user:01 name zhangsan
(integer) 1
127.0.0.1:6379> hset user:01 age 18
(integer) 1
127.0.0.1:6379> hkeys user:01
1) "name"
2) "age"
HVALS
可用版本:>= 2.0.0
时间复杂度: O(N),N为hash表的长度
命令格式
HVALS key
命令描述
返回hash表中所有field对应的vlaue值
返回值
- value值列表
示例
127.0.0.1:6379> hset user:01 name zhangsan
(integer) 1
127.0.0.1:6379> hset user:01 age 18
(integer) 1
127.0.0.1:6379> hvals user:01
1) "zhangsan"
2) "18"
HGETALL
可用版本:>= 2.0.0
时间复杂度: O(N),N为hash表的长度
命令格式
HGETALL key
命令描述
返回hash表中所有field-vlaue值,列表形式,value值在对应field后面。
返回值
- field、value值列表
示例
127.0.0.1:6379> hset user:01 name zhangsan
(integer) 0
127.0.0.1:6379> hset user:01 age 18
(integer) 0
127.0.0.1:6379> hgetall user:01
1) "name"
2) "zhangsan"
3) "age"
4) "18"
HRANDFIELD
可用版本:>= 6.2.0
时间复杂度: O(N),N为返回的个数
命令格式
HRANDFIELD key [count [WITHVALUES]]
命令描述
- 只给定key,默认返回一个随机的field
- 如果指定count,且为正数,返回field列表,元素不重复,长度为count和hash长度中较小的一个。
- 如果count为负数,返回filed重复,且field列表长度为count绝对值
-
WITHVALUES
表示返回结果中包含对应的value值
返回值
- 字符串:只指定key,没添加额外参数时,返回随机的filed或者nil(key不存在)
- 列表:指定额外参数时
示例
127.0.0.1:6379> hset user:01 name zhangsan age 18
(integer) 2
# 随机返回
127.0.0.1:6379> hrandfield user:01
"age"
127.0.0.1:6379> hrandfield user:01
"name"
# count大于hash长度
127.0.0.1:6379> hrandfield user:01 4
1) "name"
2) "age"
# count为负值
127.0.0.1:6379> hrandfield user:01 -4
1) "name"
2) "age"
3) "age"
4) "name"
# 指定withvalues参数
127.0.0.1:6379> hrandfield user:01 4 withvalues
1) "name"
2) "zhangsan"
3) "age"
4) "18"
127.0.0.1:6379> hrandfield user:01 -3 withvalues
1) "name"
2) "zhangsan"
3) "age"
4) "18"
5) "name"
6) "zhangsan"
HMSET
可用版本:>= 2.0.0
时间复杂度: O(N),N为field个数
自Redis 4.0.0,该命令已弃用,请首选HSET
命令格式
HMSET key field value [field value ...]
命令描述
- 同时设置多个field-vlaue值
返回值
- 执行结果
示例
127.0.0.1:6379> hmset user:01 name zhangsan age 18
OK
127.0.0.1:6379> hget user:01 name
"zhangsan"
127.0.0.1:6379> hmset user:02 name lisi
OK
HMGET
可用版本:>= 2.0.0
时间复杂度: O(N),N为field个数
命令格式
HMGET key field [field ...]
命令描述
- 返回多个filed对应的value值
返回值
- value值列表,如果field不存在,返回nil
示例
127.0.0.1:6379> hset user:01 name zhangsan age 18
(integer) 2
127.0.0.1:6379> hmget user:01 name age gender
1) "zhangsan"
2) "18"
3) (nil)
HSCAN
可用版本:>= 2.8.0
时间复杂度: O(1)
命令格式
HSCAN key cursor [MATCH pattern] [COUNT count]
命令描述
- 用于增量遍历整个hash表
- cursor是游标,表示从哪里开始遍历,第一次遍历时指定为0.
- MATCH 可以允许指定正则表达式
- COUNT 指定返回的个数,默认为10(系统会作为参照)
- 具体参照:SCAN
返回值
返回值包含两部分:
- 下次遍历时,游标起始位置;如果已经遍历完成,返回 0
- 本次遍历结果列表
示例
127.0.0.1:6379> hset user:01 name zhangsan age 18 gender male school seu tall 180
(integer) 4
# 第一个返回值为0,表示遍历完成
127.0.0.1:6379> hscan user:01 0
1) "0"
2) 1) "name"
2) "zhangsan"
3) "age"
4) "18"
5) "gender"
6) "male"
7) "school"
8) "seu"
9) "tall"
10) "180"
# 指定正则表达式
127.0.0.1:6379> hscan user:01 0 match nam*
1) "0"
2) 1) "name"
2) "zhangsan"
更多
个人博客: https://lifelmy.github.io/
微信公众号:漫漫Coding路