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