NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • 设计模式

  • 开发规范

  • 经验分享

  • 记录

  • 快速开始

    • Spring Boot整合RabbitMQ
    • Spring Boot整合Email邮件发送
    • Spring Boot整合jasypt加密配置文件
    • Spring Boot整合单元测试
    • Spring Boot整合优雅关机
    • Spring Boot整合Redis分布式锁
      • pom.xml
      • RedisLockConfig
      • 示例
      • Redis的分布式锁实现方式
        • 单个Redis实例
        • 加锁
        • 解锁
        • Redis集群模式
      • 参考
    • Spring Boot整合MyBatis-plus
    • XXL-JOB快速上手
    • Spring Boot整合WebSocket(stomp协议)
    • SpringBoot整合i18n(多语言)
    • 第三方登录 - Google
    • 第三方登录 - Facebook
    • Spring Boot 整合Elasticsearch
  • 笔记

  • 面试题

  • 微服务

  • 踩过的坑

  • Java
  • 快速开始
NipGeihou
2022-03-02
目录

Spring Boot整合Redis分布式锁

# pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.integration</groupId>
	<artifactId>spring-integration-redis</artifactId>
</dependency>

# RedisLockConfig

@Configuration
public class RedisLockConfig {
    @Bean(destroyMethod = "destroy")
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
        // 这里的lock是存储在redis中的key前缀“The key prefix for locks.”
        return new RedisLockRegistry(redisConnectionFactory, "lock");
    }
}

# 示例

@Autowired
private RedisLockRegistry lockRegistry;

Lock lock = lockRegistry.obtain(key);
boolean locked = false;
try {
  locked = lock.tryLock();
  if (!locked) {
    // 没有获取到锁的逻辑    
  }

  // 获取锁的逻辑
} finally {
  // 一定要解锁
  if (locked) {
    lock.unlock();
  }
}

# Redis 的分布式锁实现方式

# 单个 Redis 实例

setnx (key, 当前时间 + 过期时间) + Lua

# 加锁

set NX PX + 重试 + 重试间隔

向 Redis 发起如下命令: SET productId:lock 0xx9p03001 NX PX 30000

  • productId :由自己定义,可以是与本次业务有关的 id,"0xx9p03001" 是一串随机值,必须保证全局唯一 (原因在后文中会提到)。
  • NX :指的是当且仅当 key (也就是案例中的 "productId:lock”) 在 Redis 中不存在时,返回执行成功,否则执行失败。
  • PX 30000 :指的是在 30 秒后,key 将被自动删除。

执行命令后返回成功,表明服务成功的获得了锁。

# 解锁

采用 lua 脚本

在删除 key 时需传递 key 对应的 value 值,以保证删除的是所期望的,如果服务 A 只通过 key 来删除锁,则可能会误将服务 B 的锁释放掉。

if redis.call("get", KEYS[1])==ARGV[1] then
	return redis.call("del", KEYS[1])
else
	return 0
end

# Redis 集群模式

Redlock

# 参考

  • Spring Boot Redis 实现分布式锁,真香!! - Java 技术栈 - 博客园 (opens new window)
  • Java | 使用 Spring Redis Lock 实现分布式锁 - 简书 (opens new window)
上次更新: 2022/12/31, 03:04:26
Spring Boot整合优雅关机
Spring Boot整合MyBatis-plus

← Spring Boot整合优雅关机 Spring Boot整合MyBatis-plus→

最近更新
01
元器件
05-23
02
iSCSI服务搭建
05-10
03
磁盘管理与文件系统
05-02
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式