• 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 存储对象,相对来说更新操作比较灵活
  • 相关阅读:
    【SpringBoot】常用Starter介绍和整合模板引擎Freemaker、thymeleaf
    【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener
    【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解
    【SpringBoot】SpringBoot热部署和配置文件自动注入实战
    IntelliJ IDEA备忘
    接口与抽象类
    泛型(11)-泛型与数组
    泛型(10)-泛型擦除与转换
    泛型(9)-泛型方法与方法重载
    泛型(8)-Java7的"菱形"语法与泛型构造器
  • 原文地址:https://www.cnblogs.com/wuyongqiang/p/12642865.html
Copyright © 2020-2023  润新知