hash散列列表
介绍
Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,一个散列类型键可以包含至多2的32次方减1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段的值则存储属性值,例如:user对象有id,name和age属性,他的字段值就是对象的属性值。
注意事项:
hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil) 每个 hash 可以存储 2 32 - 1 个键值对 hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用 hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈。
hash命令列表
理解好上面的图,对命令的构成会容易理解一点 添加/修改数据 hset key field value 获取数据 hget key field hgetall key 删除数据 hdel key field1 [field2] 添加/修改多个数据 hmset key field1 value1 field2 value2 … 获取多个数据 hmget key field1 field2 … 获取哈希表中字段的数量 hlen key 获取哈希表中所有的字段名或字段值 hkeys key hvals key 获取哈希表中是否存在指定的字段 hexists key field 设置指定字段的数值数据增加指定范围的值 hincrby key field increment hincrbyfloat key field increment 为哈希表中不存在的的字段赋值 hsetnx key field value
添加/修改数据
hset key field value 为user这个key的age字段赋值,其值为20
获取数据
hget key field 获取user的age字段的值: hgetall key 获取user这个key的全部数据 下面因为只有一个才获取到一个,如果是多个的话,是全部获取的 ### 删除数据 hdel key field1 [field2] 删除user的age字段,删除成功再获取就是nil(空)了,也可以指定多个字段进行多个字段的删除的
添加/修改多个数据
hmset key field1 value1 field2 value2 …
为key这个键添加多个数据,都是以field value这样的形式,一对一对的 此时可以理解为person的id为123456,name为meng,age为24,像一个java对象一样 ### 获取多个数据 hmget key field1 field2 … 获取上面刚刚添加的多个数据,为person这个键获取id,name,age这几个字段的值 ### 获取哈希表中字段的数量 hlen key 获取刚刚添加的person的字段数量(id,nameage)所以得到结果为3
获取哈希表中所有的字段名或字段值
hkeys key
获取刚刚添加的person这个键的所有字段名 hvals key 获取person这个键的所有字段的值
获取哈希表中是否存在指定的字段
hexists key field、
查询的person键的name字段真实存在,返回1 查询person键的city字段不存在,返回0
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
让person这个键的age字段的值增加20,因为原本是24,加上20就是返回值44 如果增加一个负值,它就会减少对应的值 hincrbyfloat key field increment 让person键的age字段的值增加1.5(浮点数),因为上面已经修改age为44了,所有加上1.5就是45.5
为哈希表中不存在的的字段赋值 。
(应用于购物车数据存储设计,购物车里面有该商品就不添加,没有才能添加) hsetnx key field value 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。 如果字段已经存在于哈希表中,操作无效。 如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。 设置成功,返回 1 。如果给定域已经存在且没有操作被执行,返回 0 。 失败: 成功:
摘录一个别人的文章:hset 和hsetnx 的区别
原文链接:https://blog.csdn.net/qq756684177/article/details/81518766
命令参数: HSET key field value HSETNX key field value
作用区别: HSET 将哈希表 key 中的域 field 的值设为 value 。如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。
HSETNX 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。若域 field 已经存在,该操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。
返回值区别: HSET:如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。 HSETNX:设置成功,返回 1 。如果给定域已经存在且没有操作被执行,返回 0 。 ———————————————— 版权声明:本文为CSDN博主「Tinywan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
应用场景
电商网站购物车设计与实现
解决方案 ? 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息 ? 将商品编号作为field,购买数量作为value进行存储 ? 添加商品:追加全新的field与value ? 浏览:遍历hash ? 更改数量:自增/自减,设置value值 ? 删除商品:删除field ? 清空:删除key ?
抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
?以商家id作为key ? 将参与抢购的商品id作为field ? 将参与抢购的商品数量作为对应的value ? 抢购时使用降值的方式控制产品数量
string存储对象(json)与hash存储对象
|