Redisson

Redisson

  • [1 什么是Redisson](#1 什么是Redisson)
  • 2.SpringBoot整合Redisson
  • 3.使用Redisson实现分布式锁
    • [3.1 Redisson是如何解决这两个问题的呢?](#3.1 Redisson是如何解决这两个问题的呢?)
    • [3.2 Redisson是怎么保证自己加的锁, 自己释放锁?](#3.2 Redisson是怎么保证自己加的锁, 自己释放锁?)

1 什么是Redisson

Redisson是一个基于Redis的java框架, 用于简化Redis的操作. 它提供了丰富的功能, 包括: 分布式集合、分布式对象、分布式锁、分布式调度器等等

2.SpringBoot整合Redisson

步骤一: 添加依赖

xml 复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>{redisson-version}</version>
</dependency>

步骤二: 在application.properties文件中配置Redisson连接信息

yml 复制代码
# Redisson连接信息
spring.redis.redisson.config=classpath:/redisson.yaml

步骤三: 在这个示例中,我们通过redisson.yaml文件配置Redisson连接信息,你可以根据实际情况选择其他方式,如直接在application.properties中配置Redisson的连接信息。
Springboot-Redisson - 1.简介和配置

yml 复制代码
# 单一 Redis 服务器模式
singleServerConfig:
  # Redis 服务器的地址
  address: "redis://127.0.0.1:6379"
  # 连接池的大小
  connectionPoolSize: 64
  # Redis 服务器的密码
  password: "your_password"
  # Redis 数据库索引
  database: 0
  # 客户端名称
  clientName: "your_client_name"
  # 超时时间,单位为毫秒
  timeout: 3000
  # Redis 命令失败重试次数
  retryAttempts: 3
  # 两次命令之间重试的时间间隔,单位为毫秒
  retryInterval: 1500
  # 发布和订阅的连接的最小数量
  subscriptionConnectionMinimumIdleSize: 1
  # 发布和订阅的连接池的大小
  subscriptionConnectionPoolSize: 50
  # 当前处理 Redis 命令的线程共享的联接
  connectionMinimumIdleSize: 10

# 集群模式的配置 (需要注释或删除 singleServerConfig 当使用此模式)
#clusterServersConfig:
#  scanInterval: 2000
#  slaveConnectionPoolSize: 64
#  slaveConnectionMinimumIdleSize: 24
#  masterConnectionPoolSize: 64
#  masterConnectionMinimumIdleSize: 24
#  readMode: "SLAVE"
#  nodeAddresses:
#    - "redis://127.0.0.1:7001"
#    - "redis://127.0.0.1:7002"
#    - "redis://127.0.0.1:7003"
#  password: "your_password"

# 其他模式,如 sentinel, masterSlave, replicated 可以在这里配置,但确保只有一个模式处于未注释状态

# 线程工厂配置
threads: 16
nettyThreads: 32

# 编解码器配置,默认是 Jackson
codec: !<org.redisson.codec.JsonJacksonCodec> {}

# 传输模式,默认是 NIO
transportMode: "NIO"

步骤四: 注入RedissonClient, 使用RedissonClient

java 复制代码
@Autowired
private RedissonClient redissonClient;

3.使用Redisson实现分布式锁

1小时掌握Redisson实现Redis分布式锁以及Redlock分布式锁

java 复制代码
@Service
public class RedissonService {

    @Autowired
    private RedissonClient redissonClient;

    public void lock() {
        RLock lock = redissonClient.getLock("lock");
        try {
            if (lock.tryLock()) {   // 尝试获取锁
                // 执行业务逻辑
            }
        } finally {
            lock.unlock();  // 释放锁
        }
    }
    
}

这个代码比之前使用Redis实现分布式锁更简单, 也解决了过期时间设置、原子性等等这些问题, 其原理图如下:

使用Redis实现分布式锁, 主要存在两个问题很难解决

  • 锁的过期时间很难设置
    • 设置的太短吧, 可能会导致在执行耗时长的业务时, 提前释放锁
    • 设置的太长吧, 如果服务宕机了, 锁的生命周期就很长, 即使服务重启好了, 也要等锁释放了才能执行业务
  • 为了保证"自己加的锁, 自己释放", 就需要进行两步操作, 先根据value判断是不是自己加的锁, 然后释放锁, 这个过程不是原子性的

3.1 Redisson是如何解决这两个问题的呢?

  • 给锁续命: 使用Redisson加锁后, 设置了默认时间, 此时会启动一个后台线程去实时检查这个锁, 每10秒检查是否持有锁, 如果持有锁就延长锁的时间. 即使服务宕机了, 锁的过期时间也是很短的, 不会影响服务的访问
  • 使用脚本语言保证执行的原子性

3.2 Redisson是怎么保证自己加的锁, 自己释放锁?

如图就是通过Redisson加的锁

注意: 这是个Hash类型(对象类型), key为Lock, value是一个个键值对

这个键值对中的key是一个UUID: 2b569297-cec0-4873-908b-9aa9869acd8c:80

Redisson在加锁时会为每个锁设置一个唯一的标识符, 当客户端释放锁时,Redisson 会根据标识符来判断是否有权限释放锁。如果标识符匹配,说明客户端拥有这个锁的所有权,可以释放锁;如果不匹配,说明客户端没有权限释放这个锁,将不会执行解锁操作。

相关推荐
海的透彻1 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat1 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one2 小时前
算法--构造
java·数据结构·算法
SL_staff2 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff3 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko74 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.4 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff4 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河5 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目