Redis基本数据类型学习之Hash

1,887 阅读7分钟

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

你必须非常努力,才能看起来毫不费力!

微信搜索公众号[ 漫漫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

返回值

返回值包含两部分:

  1. 下次遍历时,游标起始位置;如果已经遍历完成,返回 0
  2. 本次遍历结果列表

示例

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"

更多

个人博客: lifelmy.github.io/

微信公众号:漫漫Coding路