java并发令牌机制,redis令牌机制实现秒杀

一、前言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个商品在几秒之内处理完成。本文并不是真是的秒杀业务场景,至少提供一种秒杀的解决思路,如果业务存在某些不确切的地方,欢迎留言交流,相互学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值