Redis的Hash类型

 Redis hash 命令

下表列出了 redis hash 基本的相关命令:

序号 命令及描述
1 HDEL key field1 [field2] 
删除一个或多个哈希表字段
2 HEXISTS key field 
查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 
获取存储在哈希表中指定字段的值。
4 HGETALL key 
获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment 
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key 
获取所有哈希表中的字段
8 HLEN key 
获取哈希表中字段的数量
9 HMGET key field1 [field2] 
获取所有给定字段的值
10 HMSET key field1 value1 [field2 value2 ] 
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value 
将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value 
只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key 
获取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count] 
迭代哈希表中的键值对。

 示例如下:

127.0.0.1:6379> HSET user name zhangsan
(integer) 1
127.0.0.1:6379> HGETALL user
1) "name"
2) "zhangsan"
127.0.0.1:6379> hest user age 38
(error) ERR unknown command `hest`, with args beginning with: `user`, `age`, `38`,
127.0.0.1:6379> hset user age 38
(integer) 1
127.0.0.1:6379> HGETALL user
1) "name"
2) "zhangsan"
3) "age"
4) "38"
127.0.0.1:6379> HGET user name
"zhangsan"
127.0.0.1:6379> hmget name age
1) (nil)
127.0.0.1:6379> hmget user name age
1) "zhangsan"
2) "38"
127.0.0.1:6379> HLEN user
(integer) 2
127.0.0.1:6379> HEXISTS user name
(integer) 1
127.0.0.1:6379> HKEYS user
1) "name"
2) "age"
127.0.0.1:6379> HVALS user
1) "zhangsan"
2) "38"
127.0.0.1:6379> HINCRBY user age 2
(integer) 40
127.0.0.1:6379> HVALS user
1) "zhangsan"
2) "40"
127.0.0.1:6379>

 hash 类型应用场景 :

 简单演示:

127.0.0.1:6379> hset u1 g01 100 g02 200
(integer) 2
127.0.0.1:6379> HGETALL u1
1) "g01"
2) "100"
3) "g02"
4) "200"
127.0.0.1:6379> HMSET u2 g01 100 g02 100
OK
127.0.0.1:6379> HGETALL u2
1) "g01"
2) "100"
3) "g02"
4) "100"
127.0.0.1:6379> hset u1 g03 5
(integer) 1
127.0.0.1:6379> HGETALL u1
1) "g01"
2) "100"
3) "g02"
4) "200"
5) "g03"
6) "5"
127.0.0.1:6379> hdel u1 g01
(integer) 1
127.0.0.1:6379> HGETALL u1
1) "g02"
2) "200"
3) "g03"
4) "5"
127.0.0.1:6379> HINCRBY g02 100
(error) ERR wrong number of arguments for 'hincrby' command
127.0.0.1:6379> HINCRBY u1 g02 100
(integer) 300
127.0.0.1:6379> HGETALL u1
1) "g02"
2) "300"
3) "g03"
4) "5"
127.0.0.1:6379> HMSET u3 g01:nums 100 g01:info {.....}
OK
127.0.0.1:6379> HGETALL u3
1) "g01:nums"
2) "100"
3) "g01:info"
4) "{.....}"
127.0.0.1:6379> HMSET u3 g02:nums 200 g02:info {.....}
OK
127.0.0.1:6379> HGETALL u3
1) "g01:nums"
2) "100"
3) "g01:info"
4) "{.....}"
5) "g02:nums"
6) "200"
7) "g02:info"
8) "{.....}"
127.0.0.1:6379>

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

当购物车保存商家信息的时候,可以把商家信息保存成一个Hash,把标记存到购物车的Hash种就可以了

业务场景
双11活动日,销售手机充值卡的商家对移动、联通、电信的30元、 50元、 100元商品推出抢购活动,每种商
品抢购上限1000张

127.0.0.1:6379> hmset p01 c30 1000 c50  1000
OK
127.0.0.1:6379> HINCRBY p01 c30 -20
(integer) 980
127.0.0.1:6379> HGETALL p01
1) "c30"
2) "980"
3) "c50"
4) "1000"
127.0.0.1:6379>

解决方案
以商家id作为key
将参与抢购的商品id作为field
将参与抢购的商品数量作为对应的value
抢购时使用降值的方式控制产品数量

hash 类型数据操作的注意事项 

 hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为( nil)hash 类型数据操作的注意事项
每个 hash 可以存储 232 - 1 个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈 

发布了407 篇原创文章 · 获赞 2 · 访问量 6788

猜你喜欢

转载自blog.csdn.net/qq_29860591/article/details/104854032
今日推荐