一、项目总介绍
(一)项目技术
SpringBoot+MySql+Lombok+MyBatis-Plus+Hutool+Redis
(二)项目描述
黑马点评项目是一个前后端分离项目,类似于大众点评,实现了发布查看商家,达人探店,点赞,关 注等功能,业务可以帮助商家引流,增加曝光度,也可以为用户提供查看提供附近消费场所。主要用来配合学习 Redis 的知识。
二、短信登录
(一)导入黑马点评项目
1、提供的SQL文件生成的表
2、项目架构
前后端分离部署(因为重点是学习Redis的企业开发,为避免麻烦,未使用微服务开发)
解释上图:
前端部署在nginx服务器上,
基于Session实现登录
集群的session共享问题
基于Redis实现共享session登录
三、商户查询缓存
四、优惠券秒杀
(一)全局ID生成器
(二)实现优惠券秒杀下单
(三)超卖问题
引出:
上节课的秒杀是自己在页面点击实现的,而真实秒杀场景下用户每秒下单量可能达到数万,在如此强大的高并发下,会出现什么问题呢?会不会超卖呢?
使用jmeter实现高并发场景:
问题分析:
分析线程问题:
理想情境下:
高并发实际情况:
原因:多个线程操作共享的资源,并且操作资源的代码有好几行,在这之间多个线程相互穿插,就出现了安全问题。(Java多线程安全问题)
超卖问题是典型的多线程安全问题,针对这一问题的常见解决方案就是加锁
锁有两种——悲观锁、乐观锁。
两种锁对比如下:
乐观锁的两种实现方案:
版本号法、CAS法
利用以上的锁,可以实现避免超卖问题
(四)一人一单
解决了超卖问题,还有一个问题待解决——
黄牛下单,一个人买完所有券,所以要实现一人一单功能。
由上面的分析,仅在下单前做一个user_id与voucher_id是否存在的判断即可
代码修改: