SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景
一、前言介绍
前段时间研究了下分布式锁,实现分布式锁也有很多种方案,有基于数据库,基于zookeeper,基于redis+lua。一般我们常用redis+lua进行实现,zookeeper对于没有使用它的项目而言再加入进去就比较麻烦了,redis是比较简单的实现方案。redisson封装好了redis+lua,我们可以很方便的使用。也看到很多博客对redisson进行分析源码,这里我就不多做分析, 大家可以参考文末列举的一两个参考博客链接。
redisson
的github
地址:https://github.com/redisson/redisson.
二、项目Demo
2.1.Demo下载地址
关注微信公众号:慌途L,发送:茅台,即可拿到资料。
2.2.模拟用户抢购
运行项目后先调用接口(http://localhost:9099/redisson/queryInventory
)将库存数量缓存到redis
,再使用JMeter
模拟多人抢购,不懂使用JMeter
的自行百度搜索使用教程,这里就不多做解释了。
2.2.1.将库存缓存到redis
调用第一个接口后redis
中会缓存有100个库存,我们使用500个线程循环10次,模拟用户抢购。
2.2.2.JMeter设置线程数:
2.2.3.JMeter设置http请求:
2.2.4.调用结果
redis中的库存数量
结论:可以看到,我们并没有超卖
三、怎么避免一个用户重复抢购?并发高了怎么处理?
既然都是抢购了,肯定要限制一个人最多能抢几件商品,抢到了再来重复下单,应该怎么处理这种问题?
这里提供一个思路,大家可以发散的想一下
- 我另外一篇文章写了一个思路:Redis - increment 递增方法 | 处理防重复和并发问题.
- 并发限流也可以使用
Sentinel
四、POM依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.0</version>
</dependency>
五、配置类,可配置单节点和集群
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 描述:
* 创建人:huangtuL
*/
@Configuration
public class MyRedissonConfig {
/**
* 单节点redis
*/
@Bean
public RedissonClient getRedissionClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
return Redisson.create(config);
}
/**
* 集群环境多节点redis
*/
// @Bean
// public RedissonClient getRedissionClusterClient(){
// Config config=new Config();
// //集群模式,集群节点的地址须使用“redis://”前缀,否则将会报错。
// //此例集群为3节点,各节点1主1从
// config.useClusterServers().addNodeAddress("redis://192.168.188.128:7001", "redis://192.168.188.128:7002",
// "redis://192.168.188.128:7003", "redis://192.168.188.128:7004", "redis://192.168.188.128:7005",
// "redis://192.168.188.128:7006");
// return Redisson.create(config);
// }
}
六、参考博客
- https://blog.csdn.net/asd051377305/article/details/108384490.
- https://www.cnblogs.com/kiko2014551511/p/11527108.html.
欢迎关注公众号:慌途L
后面会慢慢将文章迁移至公众号,也是方便在没有电脑的情况下可以进行翻阅,更新的话会两边同时更新,大家不用担心!