一、前言1. 秒杀介绍
秒杀是电商系统非常常见的功能模块,是商家进行相关促销推广的常用方式。主要特点是商品库存有限,抢购时间有限。那么在系统设计之初就应该考虑在数量和时间有限的情况下导致的一个高并发以及高并发所带来的库存超卖的问题。
秒杀需要解决的问题:
1) 库存超卖
解决方案:
1) 悲观锁:synchronize 、 Lock
2) 乐观锁:数据库乐观锁版本号控制
2) 高并发情况下系统压力以及用户体验
解决方案: redis
本教程采用:redis中list类型达到令牌机制完成秒杀。用户抢redis中的令牌,抢到令牌的用户才能进行支付,支付成功之后可以生成订单,如果一定时间之内没有支付那么就由定时任务来归还令牌
2. 开发介绍
1) 开发工具: IntelliJ IDEA2017.3.5
2) JDK版本:1.7+
3) 数据库: mysql5.7 、 Redis
4) 技术:Spring、Spring Data Redis、mybatis
二、环境搭建1. 数据库表创建
2. redis安装 ( 略 )
3. 创建mavne项目,打包方式jar,pom.xml如下
4. 数据访问层
利用mybatis逆向工程生成POJO,以及mapper接口和mapper映射文件。该部分自行操作
mybatis核心配置文件SqlMapConfig.xml
数据访问db.properties
redis配置属性文件redis-config.propertiesproperties
5. spring配置文件
applicationContext-dao.xml
applicationContext-redis.xml
三、代码实现
1.定义秒杀业务接口
2.秒杀业务实现类
3.秒杀测试类
注意:随着CountDownLatch设置并发数量越高,需要调整redis-config.properties属性中的redis.maxIdle属性
四、总结
本文介绍了利用redis的list数据类型模拟令牌队列来完成秒杀,主要解决库存超卖、高并发降低系统压力提高用户体验、解决乐观锁不能先到先得的问题。在单机上运行能够构建上万的请求利用redis抢购100个商品在几秒之内处理完成。本文并不是真是的秒杀业务场景,至少提供一种秒杀的解决思路,如果业务存在某些不确切的地方,欢迎留言交流,相互学习。