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 过多, 遍历整体数据效率就很会低, 有可能成为数据访问瓶颈
来源: http://www.bubuko.com/infodetail-3459329.html