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

news/2025/3/29 11:45:42/

🧑‍💻作者名称: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.ppmy.cn/news/1048271.html

相关文章

ForkJoinPool 你真的明白和用对了吗

ForkJoinPool 是一个功能强大的 Java 类&#xff0c;用于处理计算密集型任务&#xff0c;使用 ForkJoinPool 分解计算密集型任务&#xff0c;并并行执行它们&#xff0c;能够产生更好的性能。它的工作原理是将任务分解成更小的子任务&#xff0c;使用分而治之的策略进行操作&am…

安防监控/视频集中存储/云存储平台EasyCVR v3.3增加首页告警类型

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

正演的数值模拟(零基础,学习中)

摘要: 本贴从零开始学习正演的数值模拟方法. 1. 偏微分基础 1.1 导数 引例: 物体从一维坐标的原点开始移动, 在 t t t 时刻, 它在坐标轴的位置由函数 s ( t ) s(t) s(t) 确定, 则速度为位置变化量与时间的比值: v ( t ) d s ( t ) d t lim ⁡ Δ t → 0 s ( t Δ t ) …

APK 加固之后二次签名的问题

JKS 转为 KeyStore keytool -importkeystore -srckeystore targe.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore target.p12 keytool -v -importkeystore -srckeystore targe.p12 -srcstoretype PKCS12 -destkeystore targe.keystore -deststoretype JKS // 加固…

C# OpenCvSharp DNN 二维码增强 超分辨率

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSh…

《合成孔径雷达成像算法与实现》Figure3.12

clc clear close all% 参数设置 TBP 724; % 时间带宽积 T 42e-6; % 脉冲持续时间 t_0 1e-6; % 脉冲回波时延 Nfft 2^11; % fft长度% 参数计算 B TBP/…

代码随想录训练营day42| 416. 分割等和子集

TOC 前言 代码随想录算法训练营day42 一、Leetcode 416. 分割等和子集 1.题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#…

centos服务器搭建宝塔面板

因为电脑无线网无法登录宝塔&#xff0c;也无法ssh到服务器&#xff0c;但是热点可以连接&#xff0c;网上没找到解决方法&#xff0c;重装下。 解决办法&#xff0c;先追路由&#xff0c;结果是被防火墙拦截了&#xff0c;解封以后还不行&#xff0c;重新查&#xff0c;联动的…