我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring boot 整合 Redisson实现分布式锁并验证功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring boot 整合 Redisson实现分布式锁并验证功能

简述

整篇文章写的比较粗糙,大佬看了轻喷。前半部分 是整合spring boot和redisson, 后半部分是验证分布式锁。在整个过程中遇见了不少的问题,在此做个记录少走弯路

redisson是官方推荐的分布式锁实现方案,采用redis自身的原子命令和lua脚本来实现

1. 在idea中新建spring boot工程并引入所需依赖

idea中直接新建一个spring boot项目即可,再在pom.xml中引入所需依赖,依赖信息如下

  <!-- redis所需 -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- web页面访问所需 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-data-25</artifactId>
    <version>3.16.4</version>
</dependency>
<!-- Redisson所需依赖 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.16.4</version>
</dependency>

2. 编写相关代码实现

采用一个票卷库存来进行锁的验证,需要预先在redis里面设置一个key为ticket的信息,值为100之类的数字即可 代码示例编写:

@RestController
@Slf4j
public class RedisController {
    // spring boot 操作redis的模板方法类
    @Autowired
    private StringRedisTemplate redisTemplate;

    // redisson操作bean
    @Resource
    private Redisson redisson;
    @RequestMapping("/lock")
    public String deductTicket(){
        String lockKey = "ticket";
        
        // 在spring boot 2.0.6版本中整合的redisson,key和锁不能一样
        // redis setnx 操作,此处的lockKey在后面追加1是为了避免redisson锁时报错, 需要和待锁住的数据的key信息不同
        RLock lock = redisson.getLock(lockKey+"1");
        try {
            lock.lock();
            int ticketCount = Integer.parseInt(redisTemplate.opsForValue().get(lockKey));
            if (ticketCount > 0) {
                int realTicketCount = ticketCount - 1;
                log.info("扣除成功:剩余票数:" + realTicketCount);
                redisTemplate.opsForValue().set(lockKey, realTicketCount + "");
                return realTicketCount + "";
            } else {
                log.error("扣除失败");
                return "error";
            }
            return "end";
        } finally {
            lock.unlock();
        }
    }
}

application.yml配置信息如下

server:
  port: 8899  # web服务对外端口
  redis:
    host: 192.168.0.160 #redis地址
    database: 0 #采用的库编号
    port: 6379 #redis端口
    password: 123456 #redis密码,如果redis没有设置密码直接去掉该配置不写空

3. 模拟实际环境验证

一个简单的分布式锁验证的demo完成了,比较粗糙,验证的方式有多样的,可以采用java本身的多线程进行验证,也可以类似实际环境部署多个节点来验证,这里为了技术的广度的一个应用,采用后面的方式。

3.1 下载idea的docker插件并配置相关镜像信息

  • docker插件下载

  • idea配置docker连接虚拟机上的docker

    开启docker远程连接

vim /usr/lib/systemd/system/docker.service

找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375

重启docker

systemctl daemon-reload 
systemctl start docker

开放端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent

idea配置docker连接

配置完成后可在idea中看到连接的docker镜像、容器相关信息

3.2 将spring boot打包的jar构建为docker镜像

编写Dockerfile

在工程目录中新建Dockerfile,与pom.xml文件同级

Dockerfile内容如下

FROM openjdk:8-jdk-alpine # 指定基础镜像为jdk8
ADD target/spring-0.0.1-SNAPSHOT.jar app.jar #将打包的jar包放入镜像中并重命名为app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]  #启动jar包

在pom.xml中添加插件信息

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <imageName>com.demo/${project.artifactId}</imageName>
        <dockerDirectory></dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

idea添加docker构建配置

此处操作的目的是为了便于在idea中直接构建镜像启动容器

配置信息如下

(1)Dockerfile文件位置

(2)镜像tag

(3)构建成功后启动的容器名称

(4)端口映射 宿主机端口:容器内端口

jar包打好之后可直接点击

如果没有问题idea的docker控制台会输出容器内启动相关日志信息

此处为了验证分布式锁,需要两个节点以上,所以这里我手动启动了另外一个docker容器(暂时没有编写shell脚本)

启动命令如下

docker run -d --name demo2 -p 8900:8899 demo:1.1

容器名称demo2 映射到宿主机端口 8900

查看应用日志可使用 docker logs -f 容器名称

spring boot 构建docker镜像应该有更简单的方式,欢迎在评论区交流补充

3.2 配置nginx

可以更改默认的日志格式如下,为了记录代理的具体节点信息

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" ' '"$upstream_addr"';

配置负载均衡

upstream tomcat { 
        server 192.168.0.160:8899 weight=10; # 此处设置权重为相同的即可
        server 192.168.0.160:8900 weight=10;
    }

配置代理

location  / {
           proxy_pass http://tomcat;
           proxy_redirect default;
        }

完整的代理配置如下

配置完成后

nginx -s reload

进行访问验证

192.168.0.160/lock

可查看nginx、容器内日志信息来验证是否访问成功

nginx如何访问出现error,可查看nginx中的错误日志。如果是权限问题(# failed (13: Permission denied) while connecting to upstream) 可用root用户启动或使用命令 setsebool -P httpd_can_network_connect 1 来解决

3.3 下载安装Jmeter进行测试

Jmeter下载地址:jmeter.apache.org/download_jm…

下载解压后在bin目录中店家jmeter.bat即可启动jmeter

新增计划

配置线程信息

(1) 请求线程数

(2) 多少s内启动完线程 设置为0代表同时启动 设置为2代表2s内启动完20个线程,1s启动10个线程

添加请求

(1) ip地址

(2) 端口

(3) path信息,这里设置为jar中的地址信息

点击绿色三角箭头启动并进行验证

查看redis缓存中设置的数据是否在测试完成后符合预期值,也可查看nginx中的日志来确定请求是否平均分配到了两个节点

参考文章:
juejin.cn/post/684490…

juejin.cn/post/709110…

到此这篇关于Spring boot 整合 Redisson实现分布式锁并验证的文章就介绍到这了,更多相关Spring boot 分布式锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring boot 整合 Redisson实现分布式锁并验证功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot整合Redisson如何实现分布式锁

这篇文章将为大家详细讲解有关SpringBoot整合Redisson如何实现分布式锁,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redisson是架设在redis基础上的一个Java驻内存数据网格(In
2023-06-25

Spring Boot 集成Redisson实现分布式锁详细案例

这篇文章主要介绍了Spring Boot 集成Redisson实现分布式锁详细案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
2022-11-13

Java-Redis-Redisson分布式锁的功能使用及实现

这篇文章主要介绍了Java-Redis-Redisson-分布式锁的功能使用及实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

spring boot结合kaptcha怎么实现一个验证码登陆功能

本篇文章给大家分享的是有关spring boot结合kaptcha怎么实现一个验证码登陆功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入kaptcha所需要的jar包,我
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录