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过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈