【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车

🌟前言


之前的篇章对Redis的String、List数据类型已经做出了具体分析,并举例说明了其具体的实战场景。本文就结合Hash数据类型结构的特性,一起探讨其实战中的应用场景,并以购物车实战为例。


🌟Hash数据类型分析


Redis中的Hash数据类型是一种存储键值对的数据结构,其中键是唯一的,可以是字符串,整数或浮点数。以下是对其结构的分析:


  • 使用类似字典的方式来存储数据,可以高效的进行插入、更新、删除和查找操作。
  • 内部实现上采用哈希表作为底层数据结构。通过hash函数将键映射到哈希表的槽位,每个槽位存储一个或者多个键值对。


28e9932e257987bdfbeb7ccff5ce2f72_2ba6c097a064465ea06039a65ec72982.png


🌟Hash类型实战应用场景


通过上述对Hash类型的分析,可以结合实际需求选择适合Hash类型结构的场景。本文主要演示购物车功能的演示代码。


  • 缓存:Hash数据类型非常适合用于缓存数据,例如存储用户信息、配置信息等。可以使用Hash的字段作为键,字段对应的值存储具体的数据。这样可以减少对数据库或其他数据源的频繁查询,提高系统性能。
  • 对象存储:如果需要将一个对象存储在Redis中,可以使用Hash数据类型。对象的各个属性可以作为Hash的字段,属性值作为Hash字段对应的值,这样可以方便地获取、更新对象的某个属性,而不需要加载整个对象。
  • 数据分片:如果需要将大量数据分散存储在多个Redis实例中,可以使用Hash数据类型进行数据分片。可以根据某个字段的哈希值来确定数据应该存储在哪个实例中,以实现分布式存储。


购物车功能


生活中的例子

可以参照淘宝中的购物车来实现其功能。红色标注部分为购物车,蓝色标注部分为购物项。购物车内包含很多个购物项。


ef443e6bb9e7be196e214019525768ab_30e94f8d284e45588765ece23282ff73.png


存储分析

根据上述例子结合购物车以及购物项的关系,数据在redis中存储的样子,大概如下图所示:


7a8395ab3e558ddcc30882a06ce1d77c_e732d4b6ca6548dbb7faee9924948d71.png


实现步骤


  • 创建一个购物车实体类Cart。字段内容包含字段包含id、title、以及List<CartItem>购物项的list集合、totalAmmount总价。
  • 创建购物项实体类。字段内容包含goodId、goodTitle、goodImg、price、totalPrice购物项总价、buyNums购买数量。
  • 编写获取购物车信息以及在购物车中添加商品信息的接口。


购物车Cart类


要注意计算购物车的总价格=购物项价格之和。

return cartItemList.stream().mapToInt(CartItem::getTotalPrice).sum();


public class Cart {
    private Integer id;
    private String title;
    private List<CartItem> cartItemList;
    private Integer totalAmmount;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public List<CartItem> getCartItemList() {
        return cartItemList;
    }
    public void setCartItemList(List<CartItem> cartItemList) {
        this.cartItemList = cartItemList;
    }
    public Integer getTotalAmmount() {
        //计算购物车的总价格
        return cartItemList.stream().mapToInt(CartItem::getTotalPrice).sum();
    }
    public void setTotalAmmount(Integer totalAmmount) {
        this.totalAmmount = totalAmmount;
    }
}


CartItem购物项类


其中的goodId-商品ID、goodTitle-商品名称、goodImag-商品封面、price-商品单价、totalPrice-商品总价、buyNums-购买数量。


public class CartItem {
    private Integer goodId;
    private String goodTitle;
    private String goodImag;
    private Integer price;
    private Integer totalPrice;
    private int buyNums;
    //省略getter、setter
}


获取个人购物车


解析:


  1. 从Redis中获取当前用户的key所对应的购物车数据。
  2. 获取购物车数据中的购物项。
  3. 对购物项数据进行解析并以此遍历转为对象,放到购物项列表中。
  4. 将购物项列表添加到购物车中。


流程图如下:

image.png

image.png

image.png


public JsonData getPersonalCart(int userId) throws IOException {
        //购物项列表
        List<CartItem> cartItemList=new ArrayList<>();
        //购物车
        Cart cart=new Cart();
        //从redis中获取购物车。
        BoundHashOperations<String,Object,Object> personalCart=getCarts(userId);
        //对personalCart的数据进行解析,转为json格式。
        //1.获取购物车数据中的购物项。
        List<Object> items=personalCart.values();
        //2.对购物项进行遍历,并转为对象类型
        for(Object item:items){
            ObjectMapper objectMapper=new ObjectMapper();
            //3.转为对象格式
            CartItem cartItem=objectMapper.readValue((String) item,CartItem.class);
            //4.存储到购物项列表中
            cartItemList.add(cartItem);
        }
        //5.购物项列表放入购物车
        cart.setCartItemList(cartItemList);
        return JsonData.buildSuccess(cart);
    }
    //从redis获取购物车数据
    public BoundHashOperations<String,Object,Object> getCarts(int userId){
        String key="shopping:"+userId;
        return redisTemplate.boundHashOps(key);
    }


添加购物车


首先,我们需要理解这个流程。这个流程主要包括以下几个步骤:


  1. 获取个人购物车
  2. 根据当前商品id提取个人购物车数据
  3. 如果个人购物车数据存在当前商品id,则进行数量的增减并存入redis数据库;若不存在,则获取当前商品信息,并将商品信息存入到redis的hash中。


接下来,我们将这个流程整理成mermaid流程图的形式:


image.png

image.png

public JsonData addCart(int userId,int goodId,int buyNums){
        //添加购物车之前,需要先获取个人购物车
        BoundHashOperations<String,Object,Object> myCart=getCarts(userId);
        //判断购物车是否有这个商品,有商品则增加其数量,无商品增加其信息
        //获取当前商品信息,
        Object cacheGood=myCart.get(goodId+"");
        if (cacheGood==null){
            //redis中添加商品信息
            //首先获取商品详情信息
            XxxGood xxxGood=xxxService.findDetailById(goodId);
            //购物项中添加商品信息
            CartItem cartItem=new CartItem();
            cartItem.setGoodId(goodId);
            cartItem.setPrice(xxxGood.getPrice());
            //....其他信息
            //将购物项添加到redis中
            myCart.put(goodId+"",cartItem);
        }else {
            //增加购买数量,需要将当前商品转为对象格式
            CartItem cartItem=(CartItem)cacheGood;
            cartItem.setBuyNums(cartItem.getBuyNums()+buyNums);
            //存入到购物车中
            myCart.put(goodId,cartItem);
        }
        return JsonData.buildSuccess();
    }


清空购物车


public JsonData clearMyCart(int userId){
        String key="shopping:"+userId;
        redisTemplate.delete(key);
        return JsonData.buildSuccess();
    }


🌟写在最后


有关于Redis中的Hash数据类型实战应用场景到此就结束了。功能演示代码的逻辑简单,目的是理解Hash数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
18天前
|
监控 NoSQL Java
场景题:百万数据插入Redis有哪些实现方案?
场景题:百万数据插入Redis有哪些实现方案?
35 1
场景题:百万数据插入Redis有哪些实现方案?
|
30天前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
67 6
|
1月前
|
存储 NoSQL Java
Redis如何处理Hash冲突?
在 Redis 中,哈希表是一种常见的数据结构,通常用于存储对象的属性,对于哈希表,最常遇到的是哈希冲突,那么,当 Redis遇到Hash冲突会如何处理?这篇文章,我们将详细介绍Redis如何处理哈希冲突,并探讨其性能和实现细节。
48 1
|
12天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
33 5
|
17天前
|
存储 NoSQL Redis
Redis 哈希(Hash)
10月更文挑战第16天
31 1
|
19天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
50 2
|
19天前
|
存储 消息中间件 NoSQL
Redis 数据类型
10月更文挑战第15天
29 1
|
30天前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
53 4
|
30天前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
24 3
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
97 1