【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
目录
相关文章
|
5天前
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
5天前
|
存储 消息中间件 缓存
深入探析Redis常见数据类型及应用场景
深入探析Redis常见数据类型及应用场景
15 2
|
8天前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
5天前
|
存储 NoSQL 算法
5)深度解密 Redis 的哈希(Hash)
5)深度解密 Redis 的哈希(Hash)
11 0
|
2月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
2月前
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
2月前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
52 0
|
2月前
|
存储 缓存 NoSQL
redis数据结构-hash
redis数据结构-hash
11 0
|
2月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
2月前
|
存储 缓存 NoSQL
深入理解Redis数据类型String原理
本文深入探讨了Redis中String数据类型的实现原理和使用场景,基于Redis 5.0版本进行分析。
深入理解Redis数据类型String原理
下一篇
无影云桌面