Redis学习路线(6)—— Redis的分布式锁

本文介绍了分布式锁的两种模型——悲观锁和乐观锁,并详细探讨了Redis实现分布式锁的机制,包括通过SET操作实现原子性,以及Redisson提供的可重入锁、公平锁等特性。同时,文章讨论了Redisson的锁重试、WatchDog机制,以及在分布式锁使用过程中遇到的数据超量修改、集群状态下的锁失效等问题及解决方案。
摘要由CSDN通过智能技术生成

一、分布式锁的模型

(一)悲观锁: 认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如Synchronized、Lock都属于悲观锁。

  • 优点: 简单粗暴
  • 缺点: 性能略低

(二)乐观锁: 认为线程安全问题不一定会发生,因此不加锁,只有在更新数据时判断有没有其他线程对数据做了修改,如果没有修改则认为是安全的,自己才能更新数据;如果已经被其它线程修改,说明发生了安全问题,此时可以重试或异常。

  • 优点: 性能好
  • 缺点: 存在成功率低的问题

(三)常见的实现方式:

  • 版本号法: 通过 id-stock-version结构,通过查询的version与本次是否相同来判断是否被修改。
  • CAS法: 是版本号法的改良版,是用 old-query-new的结构,通过第一次query出来的stock,与第二次提交的stock是否一致,若一致则 old = new;

二、Redis的分布式锁

(一)分布式锁的作用: 作为公用JVM锁监视器,集群中的每台JVM都能获取锁监视器监测的线程,多个JVM内部同步了线程执行。

(二)分布式锁的需求: 多进程可见、互斥、高可用、 高性能、安全性…

(三)常见分布式锁的差异:

MySQL Redis Zookeeper
互斥 利用mysql本身的互斥锁机制 利用setnx这样的互斥命令 利用节点的唯一性和有序性实现互斥
高可用
高性能 一般 一般
安全性 断开连接,自动释放锁 利用锁超时时间,到期释放 临时节点,断开连接自动释放

(四)Redis实现分布式锁

1、获取锁:

  • 互斥: 确保只有一个线程获取锁。SETNX lock thread1

2、释放锁

  • 手动释放: DEL lock
  • 过期释放: EXPIRE lock 5

(1)通过 SET 操作 实现原子性操作: SET lock thread1 EX 10 NX,意思是创建一个lock缓存,值为thread1,保持10s时间,NX为互斥操作

(2)当锁获取失败时的方法:

  • 阻塞式获取锁: 一直等待到有线程释放锁。(对CPU资源消耗高)
  • 非阻塞式获取锁: 失败就不再尝试获取锁。

3、代码实现分布式锁

(1)需求: 定义一个类,实现Redis分布式锁功能。

public class SimpleRedisLock implements ILockService {
   

    private static final String LOCK = "lock:";

    private String threadName;

    private StringRedisTemplate redisTemplate;

    public SimpleRedisLock() {
   
    }

    public SimpleRedisLock(String threadName, StringRedisTemplate redisTemplate) {
   
        this.threadName = threadName;
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zain_horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值