redis java 并发 锁_springboot+redis分布式锁实现高并发下的秒杀

原标题:springboot+redis分布式锁实现高并发下的秒杀

为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!

在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:

1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;

2、高可用的获取锁与释放锁;

3、高性能的获取锁与释放锁;

4、具备可重入特性;

5、具备锁失效机制,防止死锁;

6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

分布式锁的三种实现方式:基于数据库实现分布式锁(比如悲观锁)、基于缓存(Redis等)实现分布式锁、基于Zookeeper实现分布式锁。

下面就以一个简单的秒杀功能来看看redis分布锁的实现,下面是一个简单的秒杀功能的设计图

e243500fec41a1885c00a6367e93069a.png

基于springboot+redis来实现,redis的配置这里就不多说了,服务层的代码:

b03c141dfbd517e796c4a39fe515add7.png

Redis上锁的简单代码

9991423549062d646cf89bda908f1c5b.png

控制层代码,秒杀接口传入商品ID,质量,用户ID

c86ba5487bd4354565da057aa3c5f498.png

数据库初始化商品表和订单表

69294fe0cd5057a731d4d6698c917edb.png

利用apache-jmeter-5.2.1进行并发测试秒杀,3000并发,单机测试,22s秒杀完成。

5fb0f53ebbf6e57ccb9d7d0165e09f74.png

23b62d7c59557f48ad72a1ed457703a0.png

库存量为0,订单记录为100条。

daa113a7e19e4a8aa8b328706d58c6e4.png

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值