SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景

SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景

    • 一、前言介绍
    • 二、项目Demo
      • 2.1.Demo下载地址
      • 2.2.模拟用户抢购
        • 2.2.1.将库存缓存到redis
        • 2.2.2.JMeter设置线程数:
        • 2.2.3.JMeter设置http请求:
        • 2.2.4.调用结果
    • 三、怎么避免一个用户重复抢购?并发高了怎么处理?
    • 四、POM依赖
    • 五、配置类,可配置单节点和集群
    • 六、参考博客

一、前言介绍

前段时间研究了下分布式锁,实现分布式锁也有很多种方案,有基于数据库,基于zookeeper,基于redis+lua。一般我们常用redis+lua进行实现,zookeeper对于没有使用它的项目而言再加入进去就比较麻烦了,redis是比较简单的实现方案。redisson封装好了redis+lua,我们可以很方便的使用。也看到很多博客对redisson进行分析源码,这里我就不多做分析, 大家可以参考文末列举的一两个参考博客链接。

redissongithub地址:https://github.com/redisson/redisson.


二、项目Demo

2.1.Demo下载地址

链接:https://pan.baidu.com/s/1sqgzYxIrkMX5-p4ZDlJ7HQ.
提取码:1nbx


2.2.模拟用户抢购

运行项目后先调用接口(http://localhost:9099/redisson/queryInventory)将库存数量缓存到redis,再使用JMeter模拟多人抢购,不懂使用JMeter的自行百度搜索使用教程,这里就不多做解释了。


2.2.1.将库存缓存到redis

调用第一个接口后redis中会缓存有100个库存,我们使用500个线程循环10次,模拟用户抢购。
SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景_第1张图片


2.2.2.JMeter设置线程数:

SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景_第2张图片


2.2.3.JMeter设置http请求:

SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景_第3张图片


2.2.4.调用结果

SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景_第4张图片

redis中的库存数量
SpringBoot整合Redisson使用分布式锁,模拟茅台抢购场景_第5张图片


结论:可以看到,我们并没有超卖


三、怎么避免一个用户重复抢购?并发高了怎么处理?

既然都是抢购了,肯定要限制一个人最多能抢几件商品,抢到了再来重复下单,应该怎么处理这种问题?

这里提供一个思路,大家可以发散的想一下

  • 我另外一篇文章写了一个思路:Redis - increment 递增方法 | 处理防重复和并发问题.
  • 并发限流也可以使用Sentinel

四、POM依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
    <groupId>org.redissongroupId>
    <artifactId>redissonartifactId>
    <version>3.17.0version>
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.

你可能感兴趣的:(Redis,Redisson,redis,redisson,JMeter,springboot,秒杀)