Redisson实现分布式锁

2023-10-31

1、Redisson简介

Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java 提供原生支持

相反,作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。而 Redisson 就是用于在 Java 程序中操作 Redis 的库,它使得我们可以在程序中轻松地使用 Redis。Redisson 在 java.util 中常用接口的基础上,为我们提供了一系列具有分布式特性的工具类。

Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。

2、Redisson实现分布式锁的步骤

2.1.引入依赖

引入重要的两个依赖,一个是spring-boot-starter-data-redis,一个是redisson:

<!--导入Lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--Spring Data Redis 的启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.7.5</version>
</dependency>

2.2.application.properties

# Redis服务器地址
spring.redis.host=192.168.3.28
# Redis服务器连接密码(默认为空)
spring.redis.password=
# Redis服务器连接端口
spring.redis.port=6379

2.3.Redisson的配置类

创建一个redisson的配置类RedissonConfig,内容如下:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private String port;

    //@Value("${spring.redis.password}")
    //private String password;

    /**
     * RedissonClient,单机模式
     * @return
     * @throws IOException
     */
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson() throws IOException {
        Config config = new Config();
        //config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);
        config.useSingleServer().setAddress("redis://" + host + ":" + port);
        return Redisson.create(config);
    }
}

2.4.Redisson分布式锁业务类

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
public class SkillService {
    @Resource
    RedissonClient redissonClient;

    private final static String LOCK_KEY = "RESOURCE_KEY";
    int n = 500;

    public void seckill() {
        //定义锁
        RLock lock = redissonClient.getLock(LOCK_KEY);
        //lock.lock();
        try {
            //尝试加锁,最大等待时间300毫秒,上锁30毫秒自动解锁
            if (lock.tryLock(300, 30, TimeUnit.MILLISECONDS)) {
                log.info("线程:" + Thread.currentThread().getName() + "获得了锁");
                log.info("剩余数量:{}", --n);
            }
        } catch (Exception e) {
            log.error("程序执行异常:{}", e);
        } finally {
            log.info("线程:" + Thread.currentThread().getName() + "准备释放锁");
            //释放锁
            lock.unlock();
        }
    }
}

2.5.Redisson分布式锁测试

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SkillServiceTest {

    @Autowired
    SkillService service;

    @RequestMapping("/testSkillService")
    public void TestSkillService(){
        for (int i = 10; i < 60; i++) { //开50个线程
            SkillThread skillThread = new SkillThread(service, "skillThread->" + i);
            skillThread.start();
        }
    }
}

class SkillThread extends Thread {

    private SkillService skillService;

    public SkillThread(SkillService skillService, String skillThreadName) {
        super(skillThreadName);
        this.skillService = skillService;
    }

    @Override
    public void run() {
        skillService.seckill();
    }
}

测试结果如下:

全部都是按照顺序依次执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redisson实现分布式锁 的相关文章

随机推荐

  • Vulkan入门精要

    Vulkan入门精要 fuxiii github io https fuxiii github io Essentials of Vulkan
  • mysql中drop、truncate、delete的区别

    DELETE DELETE是一种数据操作语言 DDL 命令 CREATE DROP ALTER TRUNCAT 使用DELETE 无法删除整个表的约束 索引 只删除数据 1 每次从表中删除一行 并且同时将该行的的删除操作记录在redo和un
  • 用JAVA写一个贪吃蛇的代码

    我很乐意为你编写一段贪吃蛇的JAVA代码 public class SnakeGame public static void main String args 创建一个SnakeGame对象 SnakeGame game new Snake
  • 用matlab画散点图并用光滑曲线连接(样条插值)

    上接 http blog csdn net cantjie article details 70216642 用matlab画散点图并用光滑曲线连接 exp10 m clc clear format short Num xlsread ex
  • MySQL的windows安装与配置

    目录 MySQL的简介 MySQL的安装 一 下载安装包 二 配置初始化文件与密码修改 三 配置环境变量 四 检验 MySQL的简介 MySQL是一种可以处理数据库的关系数据库管理系统 Relational Database Managem
  • Python实现对Mysql数据库的增删改查

    客户需求 使用Python脚本实现对对Mysql数据库的增删改查 import pymysql 显示 def readTable cursor 选择全部 cursor execute select from premoney 获得返回值 返
  • 如何通过国内网络下载安装Mac版VSCode

    最近被公司同事安利了VSCode 被它轻巧的身姿和强大的插件深深吸引 于是准备周末在自家Macbook上也安装一个 却遇到了一些问题 一般安装VSCode都是通过VSCode官网免费安装 VSCode官网链接 点击Download Mac
  • Zotero如何按照文献年份排序,如何二次排序

    https www zotero org support sorting 在文献管理的过程中 导入后 一大堆文献令人眼花缭乱 尤其研究后期 文献数量更是超出想象 除了创建文件夹和子文件夹 如何让这么多文献有序地展示出来呢 我们可以通过排列和
  • 膜拜大佬!阿里内部都在强推的K8S(kubernetes)学习指南,不能再详细了

    过去几年 以 docker kubernetes 为代表的容器技术已发展为一项通用技术 BAT 滴滴 京东 头条等大厂 都争相把容器和 k8s 项目作为技术重心 试图 放长线钓大鱼 就说阿里吧 目前基本所有业务都跑在云上 其中有一半已迁移到
  • hive环境搭建提示: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument

    提示的错误信息 SLF4J Actual binding is of type org apache logging slf4j Log4jLoggerFactory Exception in thread main java lang N
  • 虚拟机防火墙状态

    虚拟机无故挂掉可以采用的办法 CentOS 7 0默认使用的是firewall作为防火墙 1 关闭firewall systemctl stop firewalld service 停止firewall systemctl disable
  • 支付宝系统架构参考(架构图)

    转自微信公众号支付圈 支付宝是中国支付行业的一个标兵 无论是业务能力还是产品创都引领者中国支付行业的前沿 作为支付业务的基础系统的复杂性和稳定性是支付业务是否能够及时快速安全处理的根本 在此收集了支付宝的系统架构图包含 清算 客服 处理 资
  • unity屏幕截图功能

    1 在Editor文件夹新建脚本ScreenTest cs using UnityEditor using UnityEngine public class ScreenTest MonoBehaviour MenuItem Tools 截
  • ros/ros_control/controller_manager介绍

    ros robot operation system 机器人操作系统中控制管理器 controller manager 的介绍 维基翻译 原文 http wiki ros org controller manager distro indi
  • 全新Thinkphp养我吧宠物区块链网站源码+可封装APP源码 免费下载 源码搭建教程

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • Node.js的包、npm、yarn

    包 相当于java中的一个jar包 NPM全称是Node js package Manage 包的管理工具 是一个命令行软件 常用命令 npm init 初始化package json文件 npm install 包名 安装一个包 npm
  • 千分位逗号分隔

    toLocaleString 123456489656456 toLocaleString en US 带小数 但是toString toLocaleString只能保留两位 123456489656456 45764655 toLocal
  • 基于Fabric+IPFS大规模数据上链方案

    基于Fabric IPFS大规模数据上链方案 更多区块链技术与应用分类 区块链应用 区块链开发 以太坊 Fabric BCOS 密码技术 共识算法 比特币 其他链 通证经济 传统金融场景 去中心化金融 防伪溯源 数据共享 可信存证 第一章
  • 视图和基本表的区别

    基本表是实实在在得保存数据的实体 写入的数据都保存在表中 而视图是不保存数据的 也没有数据 也可以说视图就是一条语句 实际上视图从表中去数据 只是给我们的感觉好像直接从表中取得一样 表可以建立各种触发器 可以建立索引 可以建立主健 约束等
  • Redisson实现分布式锁

    1 Redisson简介 Redis 是最流行的 NoSQL 数据库解决方案之一 而 Java 是世界上最流行 注意 没有说 最好 的编程语言之一 虽然两者看起来很自然地在一起 工作 但是要知道 Redis 其实并没有对 Java 提供原生