Redis hash

Posted 黄土地上的黑石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis hash相关的知识,希望对你有一定的参考价值。

hash 类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息

  • 需要的存储结构:一个存储空间保存多个键值对数据

  • hash 类型:底层使用哈希表结构实现数据存储

    hash 存储优化:

    • 如果 field 数量较少,存储结构优化为类数组结构
    • 如果 field 数量较多,存储结构使用 HashMap 结构

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

  • 获取哈希表中是否存在指定的字段

    hexists key field

hash 类型数据扩展操作

  • 获取哈希表中所有的字段名或字段值

    hkeys key
    hvals key
    
  • 设置指定字段的数值数据增加指定范围的值

    hincrby key field increment
    hincrbyfloat key field increment
    

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

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

hash 类型应用场景

1、业务场景

电商网站购物车设计与实现

1.1、业务分析

  • 仅分析购物车的 redis 存储模型

    ​ 添加、浏览、更改数量、删除、清空

  • 购物车与数据库间持久化同步(不讨论)

  • 购物车与订单间关系(不讨论)

    • 提交购物车:读取数据生成订单
    • 商家临时价格调整:隶属于订单级别
  • 未登录用户购物车信息存储(不讨论)

    • cookie 存储

1.2、解决方案

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

当前仅仅是将数据存储到了 redis 中,并没有起到加速的作用,商品信息还必须二次去数据库查询

  • 每条购物车中的商品记录保存两条 field

  • field1 专用于保存购买数量

    • 命名格式:商品 id:nums
    • 保存数据:数值
  • field2 专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等

    • 命名格式:商品 id:info
    • 保存数据:json

    hsetnx key field value 如果 key 有值则操作失败返回 0

总结:redis 应用于购物车数据存储设计

2、业务场景

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

2.1 解决方案

  • 以商家 id 作为 key
  • 将参与抢购的商品 id 作为 field
  • 将参与抢购的商品数量作为对应的 value
  • 抢购时使用降值得方式控制产品数量
  • 实际业务中还有超卖等问题,这里不讨论

总结:redis 应用于抢购,限购类、限量发放优惠券、激活码等业务的数据存储设计

3、业务场景

string 存储对象 (json) 与 hash 存储对象

  • string 存储对象,常用于对数据进行过整体操作,比如:一次性更新全部数据,或一次性获取全部数据,偏向于只读操作
  • hash 存储对象,相对来说更新操作比较灵活

以上是关于Redis hash的主要内容,如果未能解决你的问题,请参考以下文章

Redis源代码分析--- t_hash哈希转换

Redis 学习 —— 数据类型及操作

使用Redis的Hash存储Java对象

用java代码操作Redis进行相关的Hash,String,Set,List操作

在保持相同行为的同时隐藏 url 中的 #hash 片段?

Redis redis hash getKey getValue 两个的性能差别