基于redis的购物车流程(不是很详细)

  • 请勿喷哦!!
  • >_<

我在之前的项目中,做过购物车的功能,当时从表设计到最后用postman进行接口的测试,都是我负责做的。

考虑到用户操作购物车的性能问题,我当时做的是基于redis的购物车,将购物车的所有数据都存储到redis中。

当时用了redis中的hash结构来存储所有用户购物车的数据,咱们都知道在使用hash的时候,涉及到key,field,value这三个方面的参数信息,key这块我用了 CartInfo/CartMap/CartData 这个固定的字符串来表示,在field这块为了能够表示不同用户的购物车,我用来 member:会员id:cart/member:会员id/cart:会员id 来表示,在value这块我是把会员对应的整个购物车的信息都转换为Json格式进行了存储。整个购物车对应的数据结构是这个样子的。

购物车中包含 商品总件数,总价格,以及 购物车的商品项列表,在商品项中包含 商品id,商品名,商品单价,商品件数,商品图片,商品小计 等,这里面特别要注意的就是关于价格这块在java中要用bigDecimal这个数据类型,这样可以防止精度丢失。

只有会员登录后才能操作购物车,比如添加商品,删除商品等。关于登录这块,我采用的是基于token的用户登录,类似于自己写了一个jwt【java web token】。

这样用起来更加的灵活方便,在自定义的拦截器中,当通过了层层关卡的验证后,将会员信息存入到request中,这样在其他的控制层方法中就可以通过request来获取当前登录的用户信息。为了方便在每个控制层方法中获取会员信息,我采用了 spring中自定义的参数解析器,这样就避免了在每个控制层方法中都使用requst.getAttribue来获取会员信息,而是在自定义的参数解析器中写一遍即可。

具体我是这样做的,自定义了一个实现HandlerMethodArgumentResolver接口的参数解析器 类,这里面最主要有两个方法,supportsParameter和resolveArgument,在supportsParameter中我通过methodParameter获取参数的类型和我自定义的会员类进行对比如果相等则返回true,证明找到了会员类型的参数,当返回true时就会走resolveArgument方法,在该方法中,通过request.getAttribute()获取拦截器中存入的会员信息,并将其强转为指定的会员类,进行返回。最后要想使自定义的参数解析器生效,则需要在spring-mvc的配置文件中配置mvc:annotation-driven,并在其中配置mvc:argument-resolvers,通过bean class指定自定义的参数解析器类,这样就可以在控制层的各个方法中,直接写上会员类参数,就可以通过会员类获取其中的会员id等信息。

这里面涉及到 添加商品到购物车的业务逻辑 是这样的。这个接口方法接受3个参数,其中商品id和商品个数是直接从前台传过来的,而会员类则是通过自定义的参数解析器来完成赋值的。首先我会根据商品id判断该商品是否存在,如果不存在则提示商品不存在的信息,如果存在则需要判断该商品的状态是否正常,比如是否是上架状态,如果状态是下架则提示该商品已经下架。

经过这些验证后,我会判断该会员在redis中是否有对应的购物车信息,是通过封装的工具类redisUtil中的hget来获取的,如果该会员对应的购物车信息为空,则首先要创建购物车,并且将当前商品添加到购物车中,最后还要计算购物车中的总件数和总价格,通过阿里巴巴的fastjson将其转换为json格式,并通过我封装的redisUtil的工具类hset方法,将其存入到redis中的hash结构里。

如果会员对应的购物车信息不为空,则分情况进行处理。首先看看该商品是否已经在购物车中了,如果是,则找到该商品并更改商品的数量为商品原有的数量加上前台传过来的商品的数量,还要重新计算该商品的小计,以及重新计算整个购物车中商品的件数以及总价格,最后更新redis中的数据。

如果该商品不存在购物车中,则将该商品加入会员的购物车,并重新计算整个购物车中商品的件数以及总价格,最后更新redis中的数据。

这就是整个往购物车中添加商品的逻辑,至于减少商品的个数,完全可以使用和添加商品一样的方法,只不过传过来的商品的个数为负数就行了。

而且还有一些小细节,就是如果不断的减少商品个数,当商品个数减少到零的时候,就将该商品一并从购物车中删除掉。当购物车中所有的商品都被删除的时候,也同时删除整个购物车。最后都得更新redis。

请勿喷哦!!

>_<

基于redis购物车相关推荐

  1. 基于redis购物车java代码_基于redis实现购物车基本功能

    1.准备工作: 数据库表设计 (yj_product_specification:商品规格表,用户表,商品表等     {没有规格表,只有规格值表,}), 测试工具:POSTMAN redis客户端: ...

  2. 大神级教程!300分钟撸一个基于Redis 6.0 版本的高并发架构

    刚好原先公司搞职位调整,我不太满意,赶上这波金三银四的面试浪潮,干了也有5年的后端开发了,不是大神也是有实战经验的,我就自信满满地去面了几家大厂,结果就遇到... 面试官这夺命连环12问,谁顶得住? ...

  3. 太强了,300分钟撸一个基于redis的亿级用户高并发系统

    对于双十一这种高并发.大流量的场景一般都会用到缓存抗住大并发,市面上缓存框架用的最多的无疑就是Redis了,Redis作为稳居世界排名第一的KV内存数据库,同时也是最受欢迎的分布式缓存中间件,是应对高 ...

  4. 【Redis学习02】基于session和基于redis实现登录功能

    文章目录 前言 1. 基于session实现短信登录功能 1.1 发送短信验证码 1.2 短信验证登录 1.3 登录校验功能 2. 集群的Session问题 3. 基于redis实现共享session ...

  5. 基于 Redis 实现分布式锁思考

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/xuan_lu/article/details/111600302 分布式锁 基于redis实 ...

  6. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  7. 基于Redis的分布式锁和Redlock算法

    来自:后端技术指南针 1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手 ...

  8. 从0设计一个基于Redis的锁服务

    作者:温灏,后端研发,专注于Python和Go,对分布式系统感兴趣,本文系作者投稿,有兴趣投稿的同学,请后台回复[投稿] 由于微服务大行其道,服务之间的协调工作变得越来越重要.今天来简单说一下如何搭建 ...

  9. python分布式任务调度_Python使用Celery分布式异步队列/任务调度(基于Redis) - pytorch中文网...

    今天使用爬虫有些耗时较长,需要使用任务调度,Celery是Python开发的分布式任务调度模块,Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Celery支持的消息服务有Rabb ...

最新文章

  1. 一个不错的命令行解析类
  2. react的详细知识讲解!
  3. 用 pandas + matplotlib 绘制精美的K线图
  4. JVM实用参数(八)GC日志
  5. vue3.0 AntDesignVue2.0 table的rowkey报错问题解决方法
  6. scala 连接oracle_一分钟教你学会用java连接Oracle数据库
  7. 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。...
  8. 五分钟就能上手的Android APP开发入门教程!!!
  9. 智能网联汽车云控系统第1部分:系统组成及基础平台架构
  10. LAN、MAN、WAN指的是什么网络
  11. Phalcon整合beanstalk消息队列
  12. python量化策略——改进的美林时钟代码(代码版)
  13. 计算机网络交换机无法ping,无法Ping通路由器交换机提示request time out修复方法
  14. iOS IAP 服务器二次验证突然断网了怎么办
  15. 京北机房 怀来云交换数据中心主机托管
  16. 安装OpenSSH服务
  17. matlab狐狸与野兔数学模型,狐狸与兔子数学模型的论文
  18. 毕业设计 Stm32家庭有害气体检测系统 - 物联网 嵌入式 单片机
  19. Go 函数式编程实战
  20. python库怎么绘画_python库之turtle(图形绘制) 开启新的快乐源泉

热门文章

  1. Python 打开和关闭网页(浏览器)的方法
  2. java实现增删改查_java大作业,实现学生信息增删改查
  3. JavsSE => 多态
  4. 阿里云天池,母婴数据分析
  5. 计算机系党总支书记,信息与计算机学院党总支召开2019年度党支部书记述职会...
  6. 【小卒ubuntu使用第六篇】ubuntu下如何搭建远程控制服务(包括命令行方式的ssh局域网搭建、和图形化界面的teamviewer和anydesk工具的安装使用)
  7. python 切割大文件
  8. 三维力控接入多比物联网云平台
  9. html css画五角星,css画梯形,css画五角星, css画六角星 ,css画六边形
  10. 深入浅出JavaScript(中文版)__莫里森 初读笔记