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

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:Redis从头学


在这里插入图片描述


文章目录

  • 🌟前言
  • 🌟Hash数据类型分析
  • 🌟Hash类型实战应用场景
    • 购物车功能
      • 生活中的例子
      • 存储分析
      • 实现步骤
      • 购物车Cart类
      • CartItem购物项类
      • 获取个人购物车
      • 添加购物车
      • 清空购物车
  • 🌟写在最后

🌟前言

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

🌟Hash数据类型分析

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

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

🌟Hash类型实战应用场景

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

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

购物车功能

生活中的例子

可以参照淘宝中的购物车来实现其功能。红色标注部分为购物车,蓝色标注部分为购物项。购物车内包含很多个购物项
在这里插入图片描述

存储分析

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

实现步骤

  • 创建一个购物车实体类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. 将购物项列表添加到购物车中。

流程图如下:

用户登录
获取用户userID
根据userId,从Redis中获取购物车数据
解析购物车数据中的购物项
遍历解析后的数据并转为对象
将对象添加到购物项列表中
将购物项列表添加到购物车中
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流程图的形式:

商品在购物车中
商品不在购物车中
获取个人购物车
根据当前商品id提取个人购物车数据
进行数量的增减并存入redis数据库
获取当前商品信息
将商品信息存入到redis的hash中
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数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/83015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

onvif中imaging setting图像画质总结!

前言&#xff1a; 大家好&#xff0c;今天给大家来分享一篇关于图像质量的内容&#xff0c;这个内容是我在做onvif中的imaging setting的时候&#xff0c;关注到里面有关于: brightness(亮度)color saturation(色彩饱和度)contrast(对比度)sharpness(锐度)white balance(白平衡…

ChatGPT产品发布时间表-了解别人家的创业节奏

ChatGPT产品节点-2023年7月末-长期更新 ChatGPT风靡全球&#xff0c;创造了科技史上的发展奇迹。它可以根据简短的提示生成文章、代码等&#xff0c;极大地提高了生产力。许多大品牌正在尝试利用它来生成广告和营销文字。OpenAI也在此技术上大举投资。以下是ChatGPT产品发布时间…

Haproxy原理及部署

一、Haproxy简介 1、Haproxy应用分析 LVS在企业中康复在能力很强&#xff0c;但存在不足&#xff1a; LVS不支持正则处理&#xff0c;不能实现动静分离对于大型网站LVS的事实配置较为复杂&#xff0c;维护成本相对较高 Haproxy是一款可以供高可用性、负载均衡和基于TCP和HT…

Three.js 实现模型材质局部辉光效果和解决辉光影响场景背景图显示的问题

1.Three.js 实现模型材质局部辉光效果 2.解决辉光效果影响场景背景图显示的问题 相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组合在一起创建特定的视觉效果&#xff09; 2. …

Linux 内核与架构速查

Linux 内核与架构速查 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 本文主要记录查询 Linux 计算机的内核与架构&#xff0c; 用于下载对应架构的第三方软件。 一、介绍 如上图所示&#xff0c; 有时候我们下载一些第三方软件&#xff0c; 软件会有很…

Qt应用开发(基础篇)——选项卡窗口 QTabWidget

一、前言 QTabWidget类继承于QWidget&#xff0c;是一个拥有选项卡的窗口部件。 QTabWidget类有一个选项卡栏QTabBar和一个页面区域&#xff0c;用来显示和选项卡相关联的界面。用户通过点击选项卡或者自定义快捷方式(ALTKey)切换页面。 二、QTabWidget类 1、count 该属…

Redis实战:Redis的安装及简单使用

本片将介绍 Redis 的安装及简单使用 文章目录 1、Redis安装1.1、Windows下Redis的安装1.2、Linux下Redis的安装1.3、Mac下Redis的安装&#xff08;使用Homebrew&#xff09; 2、Redis使用2.1、启动服务端客户端2.2、Redis简单命令 3、Redis命令大全 1、Redis安装 1.1、Windows…

Linux问题--docker启动mysql时提示3306端口被占用

问题描述&#xff1a; 解决方法&#xff1a; 1.如果需要kill掉mysqld服务可以先通过 lsof -i :3306 2. 查询到占用3306的PID&#xff0c;随后使用 kill -15 PID 来kill掉mysqld服务。 最后结果

软件工程模型-架构师之路(四)

软件工程模型 敏捷开发&#xff1a; 个体和交互 胜过 过程和工具、可以工作的软件 胜过 面面俱到的文件、客户合作胜过合同谈判、响应变化 胜过 循序计划。&#xff08;适应需求变化&#xff0c;积极响应&#xff09; 敏捷开发与其他结构化方法区别特点&#xff1a;面向人的…

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…

Linux驱动开发(Day4)

思维导图&#xff1a; 字符设备驱动分步注册&#xff1a;

开学有哪些好用电容笔值得买?ipad触控笔推荐平价

因为有了Apple Pencil,使得iPad就成了一款便携的生产力配件&#xff0c;其优势在于&#xff0c;电容笔搭配上iPad可以让专业的绘画师在iPad上作画&#xff0c;而且还能画出各种粗细不一的线条&#xff0c;对于有书写需求的学生党来讲&#xff0c;还是很有帮助的。但本人不敢想像…

干货!一文告诉你SCRM和CRM有什么区别和联系?

在现代商业领域&#xff0c;我们经常听到两个缩写词&#xff0c;即"SCRM"和"CRM"。它们都与客户关系管理有关&#xff0c;但具体是什么意思&#xff1f;本文将用通俗易懂的方式解释这两个概念&#xff0c;以实例分析SCRM和CRM的功能并探讨它们之间的区别和…

验证评估守护关基安全 赛宁数字孪生靶场创新实践

​​近日&#xff0c;由赛宁网安主办&#xff0c;ISC互联网安全大会组委会协办的第十一届互联网安全大会&#xff08;ISC 2023&#xff09;安全运营实践论坛圆满结束。赛宁网安产品总监史崯出席并作出主题演讲&#xff1a;《基于数字孪生靶场如何开展验证评估》&#xff0c;同时…

linux 移动mv命令(实战案例)

linux 移动命令&#xff08;你真的会用吗&#xff1f;&#xff1f;&#xff1f;&#xff09; 第一种情况&#xff1a;移动文件 例如&#xff1a; 将/gdda_file 文件下的 zlib-devel-1.2.7-18el7.x86_64.rpm 移动到 /root/ces/tools文件下 解决方法&#xff1a; mv /gdda_fi…

微服务-GateWay(网关)

所谓网关是什么意思&#xff1f; 相当于就是你们小区家的保安&#xff0c;进出小区都得获得保安的同意&#xff0c;守护你们小区的生命财产健康&#xff0c;网关也是如此&#xff0c;对每个请求都严格把关&#xff0c;将合法的或者是获得权限的请求进入服务器 网关的功能&…

AIGC|万字长文!带你了解AI大模型技术演进

一、AI的起源 在下面这张图中&#xff0c;我们可以看到两个人物&#xff1a;图中左边的人物是一位演员&#xff0c;他出演了一部名为《模仿游戏》的电影。而这部电影实际上讲述的是图中右边的人物&#xff0c;他就是是人工智能之父图灵&#xff08;Alan Turing&#xff09;。 …

vue2.x项目从0到1(七)之用户权限

此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1&#xff08;二&#xff09;之后台管理侧边栏&#xff08;动态渲染路由以及高亮&#xff09;_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …

# 快速评估立功科技基于S32K324的TMS方案

文章目录 1.前言2.立功科技的TMS方案介绍2.1 介绍资料2.2 简要介绍 3.S32K3_TriMotor评估板测试3.1 环境搭建S32 Design Studio for S32 Platform 3.4安装RTD 2.0.0安装Freemaster 3.2 3.2 例程测试3.3 例程适配3.4 双核烧录3.5 测试 1.前言 最近和一些做汽车水泵/风机的客户交…

【论文阅读】 Model Sparsity Can Simplify Machine Unlearning

Model Sparsity Can Simplify Machine Unlearning 背景主要内容Contribution Ⅰ&#xff1a;对Machine Unlearning的一个全面的理解Contribution Ⅱ&#xff1a;说明model sparsity对Machine Unlearning的好处Pruning方法的选择sparse-aware的unlearning framework Experiments…