redis中文学习网 https://www.redis.net.cn

hset / hget 设置、读取一个hash

127.0.0.1:6379> hset website google www.google.com baidu www.baidu.com qiyuan www.qiyuan.run
(integer) 3
127.0.0.1:6379> hget website google                  #就以上版本中只能读取一个hash中的一个filed的值
"www.google.com"

127.0.0.1:6379> hget website google
"www.google.com"
127.0.0.1:6379> hset website google www.google.cn     #重置google的值
(integer) 0                                           #0表示已经覆盖,如果是1,表示这个google本来不存在,就新增加
127.0.0.1:6379> hget website google
"www.google.cn"

hmset / hmget 类似hset和hget

127.0.0.1:6379> hmset personinfo username admin password 12345 avatar www.qiyuan.run/logo.png email 98765@qq.com
OK
127.0.0.1:6379> hmget personinfo username password    #可同时获取一个hash中的多个filed的值
1) "admin"
2) "12345"
127.0.0.1:6379> hget personinfo avatar                #hmset设置的值,也可以使用hget获取
"www.qiyuan.run/logo.png"
127.0.0.1:6379> hset personinfo username root phone 1345678998    
(integer) 1                                           #这里的 1 表示对于这个hash来说,这条命令中增加了1个新的field --> phone
127.0.0.1:6379> hmget personinfo username phone
1) "root"
2) "1345678998"
3) ```

hgetall 获取一个hash的所有field

127.0.0.1:6379> hgetall personinfo
 1) "username"
 2) "root2"
 3) "password"
 4) "12345"
 5) "avatar"
 6) "www.qiyuan.run/logo.png"
 7) "email"
 8) "98765@qq.com"
 9) "phone"
10) "1345678993"

#列表形式返回哈希表的字段及字段值。 若 key 不存在,返回空列表。
127.0.0.1:6379> hgetall personinfo2
(empty array)

Hexists 命令用于查看哈希表的指定字段是否存在

127.0.0.1:6379> hexists personinfo username
(integer) 1                   #存在
127.0.0.1:6379> hexists personinfo name
(integer) 0                   #不存在

hincrby 增加指定步长

127.0.0.1:6379> hgetall personinfo
1) "username"
2) "admin"
3) "password"
4) "12345"
127.0.0.1:6379> hincrby personinfo username 10
(error) ERR hash value is not an integer       #必须是integer类型的才能执行
127.0.0.1:6379> hincrby personinfo age 10      #起初没有age字段,会在执行该命令前,先创建这个字段age,再来加步长10
(integer) 10
127.0.0.1:6379> hincrby personinfo age 1       #增加1
(integer) 11
127.0.0.1:6379> hget personinfo age
"11"
127.0.0.1:6379> hincrby personinfo age 1
(integer) 12
127.0.0.1:6379> hget personinfo age
"12"
127.0.0.1:6379> hincrby personinfo age -1     #没有hdecrby命令,可以使用增加-1来实现递减
(integer) 11
127.0.0.1:6379> hget personinfo age
"11"
#增量也可以为负数,相当于对指定字段进行减法操作。
#如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
#如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
#对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。
#本操作的值被限制在 64 位(bit)有符号数字表示之内。

hlen 获取hash中有几个field

127.0.0.1:6379> hlen personinfo
(integer) 3                    #表示有3个field
127.0.0.1:6379> hgetall personinfo
1) "username"
2) "admin"
3) "password"
4) "12345"
5) "age"
6) "11"
127.0.0.1:6379> hlen personinfo2
(integer) 0                    #当 key 不存在时,返回 0 

hdel 删除hash中指定的一个或多个 field

127.0.0.1:6379> hdel personinfo username password
(integer) 2                    #返回表示被删除的field的个数,不存在的字段将被忽略。
127.0.0.1:6379> hgetall personinfo
1) "age"
2) "11"

hvals 返回指定hash的所有field的值

127.0.0.1:6379> hgetall personinfo
1) "age"
2) "11"
3) "username"
4) "admin"
5) "password"
6) "12345"
127.0.0.1:6379> hvals personinfo
1) "11"
2) "admin"
3) "12345"
#当 key 不存在时,返回一个空数组
127.0.0.1:6379> exists personinfo
(integer) 0
127.0.0.1:6379> hvals personinfo
(empty array)

hincrbyfloat 增加执行浮点步长,类似hincrby

127.0.0.1:6379> hmset personinfo username Tom score 98.5
OK
127.0.0.1:6379> hgetall personinfo
1) "username"
2) "Tom"
3) "score"
4) "98.5"
127.0.0.1:6379> hincrbyfloat personinfo score 0.5
"99"
127.0.0.1:6379> hincrbyfloat personinfo score 0.1
"99.1"
127.0.0.1:6379> hgetall personinfo
1) "username"
2) "Tom"
3) "score"
4) "99.1"
127.0.0.1:6379> hincrbyfloat personinfo2 score 0.1      #对于没有的key,或者没有的field,会先创建,初始化为 0,在新增步长
"0.1"
127.0.0.1:6379> hgetall personinfo2
1) "score"
2) "0.1"

hkeys 获取所有的字段名称

127.0.0.1:6379> hkeys personinfo
1) "username"
2) "score"

hsetnx 如果存在字段,则不设置,不存在,则设置

127.0.0.1:6379> hgetall personinfo
1) "username"
2) "Tom"
127.0.0.1:6379> hsetnx personinfo username Jane
(integer) 0           #存在,返回0
127.0.0.1:6379> hsetnx personinfo age 18
(integer) 1           #不存在,返回1

应用场景

image.png

  • 以客户id作为key,每位客户创建一个hash存储结构存 储对应的购物车信息
  • 将商品编号作为field,购买数量作为value进行存储
  • 添加商品:追加全新的field与value
  • 浏览:遍历hash
  • 更改数量:自增/自减,设置value值
  • 删除商品: .删除field
  • 清空:删除key