黑马redis学习记录:分布式锁

一、基本原理和实现方式对比

分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。

分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
黑马redis学习记录:分布式锁_第1张图片
分布式锁应该满足的条件:

  1. 可见性:多个线程都能看到相同的结果,注意:这个地方说的可见性并不是并发编程中指的内存可见性,只是说多个进程之间都能感知到变化的意思

  2. 互斥:互斥是分布式锁的最基本的条件,使得程序串行执行

  3. 高可用:程序不易崩溃,时时刻刻都保证较高的可用性

  4. 高性能:由于加锁本身就让性能降低,所有对于分布式锁本身需要他就较高的加锁性能和释放锁性能

  5. 安全性:安全也是程序中必不可少的一环
    黑马redis学习记录:分布式锁_第2张图片

常见的三种分布式锁:

  1. Mysql:mysql 本身就带有锁机制,但是由于 mysql 性能本身一般,所以采用分布式锁的情况下,其实使用 mysql 作为分布式锁比较少见

  2. Redis:redis 作为分布式锁是非常常见的一种使用方式,现在企业级开发中基本都使用 redis 或者 zookeeper 作为分布式锁,利用 setnx 这个方法,如果插入 key 成功,则表示获得到了锁,如果有人插入成功,其他人插入失败则表示无法获得到锁,利用这套逻辑来实现分布式锁

  3. Zookeeper:zookeeper 也是企业级开发中较好的一个实现分布式锁的方案,由于这套视频不讲解zookeeper 的原理和分布式锁的实现,自己搜索了解
    黑马redis学习记录:分布式锁_第3张图片

二、 Redis分布式锁的实现核心思路

实现分布式锁时需要实现的两个基本方法:

  • 获取锁:
    • 互斥:确保只能有一个线程获取锁
    • 非阻塞:尝试一次,成功返回true,失败返回false
  • 释放锁:
    • 手动释放
    • 超时释放:获取锁时添加一个超时时间

在这里插入图片描述
核心思路:

利用 redis 的 setNx 方法,当有多个线程进入时,我们就利用该方法,第一个线程进入时,redis 中就有这个 key 了,返回了1,如果结果是1,则表示他抢到了锁,那么他去执行业务,然后再删除锁,退出锁逻辑,没有抢到锁的哥们,等待一定时间后重试即可。
黑马redis学习记录:分布式锁_第4张图片

三、实现分布式锁(版本一)

锁的基本接口
黑马redis学习记录:分布式锁_第5张图片
实现类: SimpleRedisLock

  • 获取锁:利用 setnx 方法进行加锁,同时增加过期时间,防止死锁,此方法可以保证加锁和增加过期时间具有原子性
  • 释放锁:防止删除别人的锁
public class SimpleRedisLock implements ILock{
   

    // 用户传过来的业务名称
    private String name;
    private StringRedisTemplate stringRedisTemplate;

    public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {
   
        this.name = name;
        this.stringRedisTemplate = stringRedisTemplate;
    }

    // 锁的名称前缀
    private static final String KEY_PREFIX = "lock:";

    @Override
    public boolean tryLock(long timeoutSec) {
   
        // 获取线程标识
        String threadId = Thread.currentThread().getId()
        String key = KEY_PREFIX + name;
        // 获取锁
        Boolean success = stringRedisTemplate.opsForValue()
                .setIfAbsent(key, threadId, timeoutSec, TimeUnit.SECONDS);
        // 直接返回 success 会有空指针的风险,因为有个拆箱操作
        return 

你可能感兴趣的:(redis,redis,分布式,学习)