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

news2024/11/18 20:38:38

🧑‍💻作者名称: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数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用媒体查询(media query)来适配不同设备上的样式?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用媒体查询适配不同设备上的样式⭐ 基本语法⭐ 示例⭐ 常见的媒体特性⭐ 创建响应式布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来…

(2)、将SpringCache扩展功能封装为starter

(2)、将SpringCache扩展功能封装为starter 1、准备工作 前面我们写了一个common-cache模块,尽可能的将自定义的RedisConnectionFactory, RedisTemplate, RedisCacheManager等Bean封装了起来。 就是为了方便我们将其封装为一个Starter。 我们这里直接《SpringCache+Redis实…

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…

Communication Channels

沟通渠道 n * (n - 1) / 2 你1 相关方3 4 4 * 3 / 2 6 你1 相关方3 相关方1 5 5 * 4 / 2 10 人越多&#xff0c;沟通渠道越多&#xff0c;沟通成本理论越高

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…

CSSCI、北核期刊投稿指南(2023年更新)

该数据为经管类的期刊投稿指南&#xff0c;包含发表难度&#xff0c;文章数量&#xff0c;影响因子&#xff0c;用户评价等指标。共5份文件&#xff0c;分别为国内所有期刊信息库、投稿指南&#xff08;CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本&#xff09; 一、…

Risk Probability

风险概率计算 sum p1 * v1 p2 * v2 p3 * v3 ... pn * vn

memmove的实现与使用

memmove与memcpy相比&#xff0c;可以实现同一数组的赋值 memmove要点 1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 2.如果源空间和目标空间出现重叠&#xff0c;就得使用memmove函数处理。 函数实现 void* my_memmove(void* dest, void* sor…

【无监督】5、DINO | 使用自蒸馏和 transformer 来释放自监督学习的超能力(ICCV2021)

文章目录 一、背景二、相关工作三、方法四、效果 论文&#xff1a;Emerging Properties in Self-Supervised Vision Transformers 代码&#xff1a;https://github.com/facebookresearch/dino 出处&#xff1a;ICCV2021 | FAIR DINO&#xff1a; self-DIstillation with NO …

Ubuntu服务器service版本初始化

下载 下载路径 官网&#xff1a;https://cn.ubuntu.com/ 下载路径&#xff1a;https://cn.ubuntu.com/download 服务器&#xff1a;https://cn.ubuntu.com/download/server/step1 点击下载&#xff08;22.04.3&#xff09;&#xff1a;https://cn.ubuntu.com/download/server…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)

需求&#xff1a;&#xff1a; 有一个List<Map<String.Object>>,存储了某年某月的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;需按月份统计每个年月数据出现的次数&#xff0c;并且按照月份排序&#xff1…

Oracle19c-补丁升级报错合集(一)

前言: 本文主要介绍Oracle19c补丁升级遇到的问题&#xff0c;涉及安装补丁prepatch步骤&#xff0c;apply应用报错以及datapatch -verbose数据字典更新报错 问题一: 在执行补丁rootcrs.sh -prepatch操作时&#xff0c;发生执行检查命令cluutil -chkshare报错 CLSRSC-180: An …

春秋云镜 CVE-2019-9042

春秋云镜 CVE-2019-9042 Sitemagic CMS v4.4 任意文件上传漏洞 靶标介绍 Sitemagic CMS v4.4 index.php?SMExtSMFiles 存在任意文件上传漏洞&#xff0c;攻击者可上传恶意代码执行系统命令。 启动场景 漏洞利用 login进入登陆界面admin/admin 访问http://eci-2zebi1tekpr…

什么是BEM命名规范?为什么要使用BEM命名规范?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范⭐ 为什么使用BEM命名规范&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…

ROS_LINUX学习笔记=2=

B站ros入门教程 rqt_robot_steering 控制小乌龟 在index ros .rog中查找相关的包&#xff1a;rosindex 下图是rqt_robot_steering的简介 其中可以查看github源码地址 website可以查看效果图 下载相关的包 sudo apt install ros-kinetic-rqt-robot-steering roscore打开ros核…

C++入门知识点——解决C语言不足

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

D. Anton and School - 2

范德蒙德恒等式 考虑统计每一个右括号位置的贡献&#xff0c;也就是每个右括号作为右边起点的贡献 其中i0的时候&#xff0c;r-1<r-0,故i0时贡献为0&#xff0c;直接套用恒等式不会有影响 #include <bits/stdc.h> using namespace std; typedef long long int ll; # d…

JAVA入坑之高级文件处理

一、图片文件简介及解析 1.1图形图像基础概念 1.2JAVA图形图像关键类 1.3图形的基本操作 package org.example;import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; imp…

foobar2000使用笔记

foobar2000使用笔记 现在大多数在线音乐不开通VIP会员&#xff0c;很多歌曲只能听很短几句就听不了了。即使是歌曲免费&#xff0c;想听的歌在不同的APP平台&#xff0c;也较为不便。没办法&#xff0c;听歌又回归到了很多年前下载到本地播放的方式。电脑上的离线音乐一直用网上…