Redis(案例四:购物车实现案例-Hash数据)

文章目录

        • 购物车常见实现方式
        • 购物⻋数据结构介绍
        • 相关VO类和数据准备
        • 数据源层
        • json⼯具类
        • 添加购物车接口、查看我的购物车、清空购物车

购物车常见实现方式

1、实现方式⼀:存储到数据库性能存在瓶颈
2、实现方式⼆:前端本地存储-localstoragesessionstoragelocalstorage在浏览器中存储key/value 对,没有过期时间。sessionstorage在浏览器中存储 key/value 对,在关闭会话窗⼝后将会删除这些数据。
3、实现方式三:后端存储到缓存如redis可以开启AOF持久化防⽌重启丢失(推荐)

购物⻋数据结构介绍

⼀个购物车里面,存在多个购物项,所以购物车结构是⼀个双层Map:
Map<String,Map<String,String>>
第⼀层Map,Key是⽤户id
第⼆层Map,Key是购物⻋中商品id,值是购物⻋数据

相关VO类和数据准备

VideoDO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class VideoDO {private int id;private String title;private String img;private int price;

CartItemVO

public class CartItemVO {/*** 商品id*/private Integer productId;/*** 购买数量*/private Integer buyNum;/*** 商品标题*/private String productTitle;/*** 图片*/private String productImg;/*** 商品单价*/private int price;/*** 总价格,单价+数量*/private int totalPrice;public int getProductId() {return productId;}public void setProductId(int productId) {this.productId = productId;}public Integer getBuyNum() {return buyNum;}public void setBuyNum(Integer buyNum) {this.buyNum = buyNum;}public String getProductTitle() {return productTitle;}public void setProductTitle(String productTitle) {this.productTitle = productTitle;}public String getProductImg() {return productImg;}public void setProductImg(String productImg) {this.productImg = productImg;}/*** 商品单价 * 购买数量** @return*/public int getTotalPrice() {return this.price * this.buyNum;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public void setTotalPrice(int totalPrice) {this.totalPrice = totalPrice;}
}

CartVO

import java.util.List;public class CartVO {/*** 购物项*/private List<CartItemVO> cartItems;/*** 购物车总价格*/private Integer totalAmount;/*** 总价格* @return*/public int getTotalAmount() {return cartItems.stream().mapToInt(CartItemVO::getTotalPrice).sum();}public List<CartItemVO> getCartItems() {return cartItems;}public void setCartItems(List<CartItemVO> cartItems) {this.cartItems = cartItems;}
}

数据源层

import net.xdclass.xdclassredis.model.VideoDO;
import org.springframework.stereotype.Repository;import java.util.HashMap;
import java.util.Map;@Repository
public class VideoDao {private static Map<Integer,VideoDO> map = new HashMap<>();static {map.put(1, new VideoDO(1,"工业级PaaS云平台+SpringCloudAlibaba 综合项目实战(完结)","https://xdclass.net",1099));map.put(2,new VideoDO(2,"玩转新版高性能RabbitMQ容器化分布式集群实战","https://xdclass.net",79));map.put(3,new VideoDO(3,"新版后端提效神器MybatisPlus+SwaggerUI3.X+Lombok","https://xdclass.net",49));map.put(4,new VideoDO(4,"玩转Nginx分布式架构实战教程 零基础到高级","https://xdclass.net",49));map.put(5,new VideoDO(5,"ssm新版SpringBoot2.3/spring5/mybatis3","https://xdclass.net",49));map.put(6,new VideoDO(6,"新一代微服务全家桶AlibabaCloud+SpringCloud实战","https://xdclass.net",59));}/*** 模拟从数据库找* @param videoId* @return*/public VideoDO findDetailById(int videoId) {return map.get(videoId);}
}

json⼯具类

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonUtil {private static final ObjectMapper MAPPER = new ObjectMapper();/*** 把对象转字符串* @param data* @return*/public static String objectToJson(Object data){try {return MAPPER.writeValueAsString(data);}catch (Exception e){e.printStackTrace();}return null;}/*** json字符串转对象* @param jsonData* @param beanType* @param <T>* @return*/public static <T> T jsonToPojo(String jsonData, Class<T> beanType){try {T t = MAPPER.readValue(jsonData,beanType);return t;}catch (Exception e){e.printStackTrace();}return null;}}

添加购物车接口、查看我的购物车、清空购物车

import net.xdclass.xdclassredis.dao.VideoDao;
import net.xdclass.xdclassredis.model.VideoDO;
import net.xdclass.xdclassredis.util.JsonData;
import net.xdclass.xdclassredis.util.JsonUtil;
import net.xdclass.xdclassredis.vo.CartItemVO;
import net.xdclass.xdclassredis.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("api/v1/cart")
public class CartController {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate VideoDao videoDao;@RequestMapping("add")public JsonData addCart(int videoId,int buyNum){//获取购物车BoundHashOperations<String,Object,Object> myCart = getMyCartOps();Object cacheObj = myCart.get(videoId+"");String result = "";if(cacheObj!=null){result = (String)cacheObj;}//购物车没这个商品if(cacheObj == null){CartItemVO cartItem = new CartItemVO();VideoDO videoDO = videoDao.findDetailById(videoId);cartItem.setBuyNum(buyNum);cartItem.setPrice(videoDO.getPrice());cartItem.setProductId(videoDO.getId());cartItem.setProductImg(videoDO.getImg());cartItem.setProductTitle(videoDO.getTitle());myCart.put(videoId+"",JsonUtil.objectToJson(cartItem));}else {//增加商品购买数量CartItemVO cartItemVO = JsonUtil.jsonToPojo(result,CartItemVO.class);cartItemVO.setBuyNum(cartItemVO.getBuyNum()+buyNum);myCart.put(videoId+"",JsonUtil.objectToJson(cartItemVO));}return JsonData.buildSuccess();}/*** 查看我的购物车*/@RequestMapping("mycart")public JsonData getMycart(){//获取购物车BoundHashOperations<String,Object,Object> myCart = getMyCartOps();List<Object> itemList =  myCart.values();List<CartItemVO> cartItemVOList = new ArrayList<>();for(Object item : itemList){CartItemVO cartItemVO = JsonUtil.jsonToPojo((String)item,CartItemVO.class);cartItemVOList.add(cartItemVO);}CartVO cartVO = new CartVO();cartVO.setCartItems(cartItemVOList);return JsonData.buildSuccess(cartVO);}/*** 清空我的购物车* @return*/@RequestMapping("clear")public JsonData clear(){String key = getCartKey();redisTemplate.delete(key);return JsonData.buildSuccess();}/*** 抽取我的购物车通用方法* @return*/private BoundHashOperations<String,Object,Object> getMyCartOps(){String key = getCartKey();return redisTemplate.boundHashOps(key);}private String getCartKey(){//用户的id,从拦截器获取int userId = 88;String cartKey = String.format("video:cart:%s",userId);return cartKey;}}

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

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

相关文章

P2598-狼和羊的故事【最大流,最小割】

正题 评测记录&#xff1a; https://www.luogu.org/recordnew/lists?uid52918&pidP2598 大意 有n*m的矩阵&#xff0c;里面有羊和狼(也有可能是空)&#xff0c;可以在两个格子之间围上篱笆让两个格子不能互相到达&#xff0c;要求狼的格子不能和羊的格子在同一个联通块…

.NET Core 2.0 正式发布信息汇总

万众瞩目的.NET Core 2.0终于发布了&#xff0c;原定于9.19的dotnetconf大会的发布时间大大提前了1个月&#xff0c;.NET Core 2.0/.NET Standard 2.0的正式发布是.NET 开源跨平台的一个重大里程碑&#xff0c; 可以激活庞大的10几年以来各大公司和社区.NET 平台上的投资&#…

JFreeChart(七)之气泡图表​​​​​​​

转载自 JFreeChart气泡图表 本章演示如何使用JFreeChart从一个给定的业务数据创建气泡图表。使用气泡图显示在三维方式的信息。气泡绘制在其中(x&#xff0c;y)坐标相交的地方。气泡的大小被认为是范围或X和Y轴的数量。 业务数据 考虑不同的人的年龄&#xff0c;体重和工作…

家校共建,用心教学

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。最近&#xff0c;我的个人站上线啦&#xff0c;大家可以直接在浏览器的地址栏中输入&#xff1a;穆雄雄.com&#xff0c;轻轻敲击回车&#xff0c;即可直接进入……

Json字符串和对象相互转换

文章目录1、JsonUtil工具类把对象转换为json字符串把json字符串转换为对象把json字符串转换为List集合2、Gson把对象转换为json字符串把json字符串转换为对象把json字符串转换为List对象把list转换为json格式字符串1、JsonUtil 工具类 import com.fasterxml.jackson.databind…

2018/7/6-纪中某C组题【jzoj1192,jzoj1397,jzoj1736】

前言 全体爆零&#xff0c;十分开心 正题 T1&#xff1a;矩阵 大意 就是N个矩阵&#xff0c;然后进行矩阵乘法(n∗mn∗m和m∗pm∗p的矩阵相乘就会变成n∗pn∗p的矩阵并且运算次数是n∗m∗pn∗m∗p)&#xff0c;然后求最小乘法运算次数。 考试时 一直以为会是图论&#xff…

ASP.NET Core - Razor页面之Handlers处理方法

简介 在前一篇文章中&#xff0c;我们讨论了Razor页面。今天我们来谈谈处理方法&#xff08;Handlers&#xff09;。我们知道可以将代码和模型放在 .cshtml 文件里面或与 .cshtml 匹配的 .cshtml.cs 文件中。Razor页面处理程序或处理方法将用户请求匹配到我们的方法&#xff1…

JFreeChart(八)之时序图

转载自 JFreeChart时序图 时序图表显示的数据点在相等的时间间隔序列变化。本章演示了如何从一个给定的业务数据使用JFreeChart&#xff0c;建立时序图。 业务数据 让我们考虑通过使用标准 Java API 的 Math.random()产生的各种随机数。我们使用这些数字产生一个时间序列图…

立德树人

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。最近&#xff0c;我的个人站上线啦&#xff0c;大家可以直接在浏览器的地址栏中输入&#xff1a;穆雄雄.com&#xff0c;轻轻敲击回车&#xff0c;即可直接进入……

.NET Standard 2.0 特性介绍和使用指南

前言 早上起来.NET社区沸腾了&#xff0c;期待已久的.NET Core 2.0终于发布&#xff01;根据个人经验&#xff0c;微软的产品一般在2.0时会趋于成熟&#xff0c;所以一个新的.Net开发时代已经来临&#xff01;未来属于.NET Core。 对于.NET Core 2.0的发布介绍&#xff0c;围绕…

2018/7/7-纪中某C组题【jzoj1494,jzoj1495,jzoj1496,jzoj1497】

前言 290卡成145&#xff0c;十分开心。 正题 T1&#xff1a;密码 大意 N个数乘起来 考试时 看起来十分简单的高精乘单精 解题思路 10241024其实是10241024高精乘高精了解一下&#xff0c;30分QAQ 代码(高精乘高精我就不解释了吧) #include<cstdio> #include<…

加油四班!加油佟穆!我们的征途是星辰大海!!!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】首先&#xff0c;感谢佟老师与范老师&#xff0c;在我不在的时候&#xff0c;三班的就业和四班的学习都落在了两位老师的肩头&#xff0c;其次&#xff0c;还需要特别感谢冯老师&#xff0c;能抽时间…

JFreeChart(一)之架构

转载自 JFreeChart架构 本章介绍给大家介绍 JFreeChart 不同类中如何交互的概念, JFreeChart基本类层次和应用水平的架构在基于Java应用程序如何工作的。 类层次架构 类层次架构解释了如何把不同阶层的相互库交互&#xff0c;以创建不同类型的图表。 以下是在上述框图中使用…

Redis(案例五:Set数据)

案例实战需求之大数据下的用户画像标签去重 介绍 用户画像 英文为User Profile&#xff0c;是根据用户基本属性、社会属性、行为属性、心理属性等真实信息⽽抽象出的⼀个标签化的、虚拟的⽤户模型。“⽤户画像”的实质是对 “⼈”的数字化。应⽤场景有很多&#xff0c;比如个性…

体验 PHP under .NET Core

昨天在 The week in .NET 中发现 Scott Hanselman 的这篇博文 Peachpie - Open Source PHP Compiler to .NET and WordPress under ASP.NET Core&#xff0c;知道了 Peachpie PHP 编译器加入了 .NET 基金会&#xff0c;借助 Peachpie &#xff0c;.NET Core 已经支持 PHP 。 今…

上学的你,是不是最怕老师给家长打电话……

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。今天&#xff0c;做了个重要的工作&#xff0c;趁着五一这个假期&#xff0c;准备和每个家长都通一次话&#xff0c;将学生在学习情况给家长说明一下&#xff0c;站在我的角度&#xff0c;也从…

2018/7/8-纪中某C组题【jzoj1619,jzoj1620,jzoj1621,jzoj1622】

前言 分数250250&#xff0c;十分开心 正题 T1&#xff1a;音乐节拍 洛谷题目链接&#xff1a;https://www.luogu.org/problemnew/show/P2969 大意 有n段音乐&#xff0c;每段音乐持续时间不同&#xff0c;q个询问求一个时间点再放那首歌 考试时 开始时发现询问的时间点不…

IDEA一定要改的8条配置

转载自 IDEA一定要改的8条配置 引言 坦白说&#xff0c;我很少写这种操作类型的文章。因为这种文章没啥新意&#xff0c;大家操作步骤肯定是一样的。然而&#xff0c;我答应了我的同事小阳&#xff0c;给她出一篇&#xff01;毕竟人家打算从Eclipse转IDEA了&#xff0c;于是…

Redis(案例六:ZSet数据)

案例实战之SortedSet⽤户积分实时榜单最佳实践 背景 ⽤户玩游戏-积分实时榜单 IT视频热销实时榜单 电商商品热销实时榜单 ⼀般的排⾏榜读多写少&#xff0c;可以对 master 进⾏写⼊操作&#xff0c;然后多个 slave 进⾏读取操作。如果是对象记得重写HashCode与Equals⽅法 User…

.NET Core 2.0使用NLog

最近研究了一下NLog的使用方式&#xff0c;简单的入了一下门。 实现的功能&#xff0c;对于不同的日志&#xff0c;进行不同的记录&#xff0c;分别有系统运行日志&#xff0c;和个人在程序中写的异常日志。发布之后放在了IIS上。进行查看日志的信息 参考了两篇博客。 1.ht…