[Redis] Redis分布式锁

Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则 SET)的简写。

 获取锁:

# 添加锁,NX是互斥、EX是设置超时时间

SET lock value NX EX 10

 释放锁

 # 释放锁,删除即可

DEL key

 

redission实现的分布式锁

执行流程

在redisson的分布式锁中,提供了一个WatchDog(看门狗),一个线程获取锁成功以后, WatchDog会给持有锁的线程续期(默认是每隔10秒续期一次)

示例代码

    public void redisLock() throws InterruptedException{
        // 获取锁,执行锁的名称
        RLock lock = redissonClient.getLock("lock");
        try {
            boolean isLock = lock.trylock(10, TimeUnit.SECONDS);
            if (isLock){
                System.out.println("执行业务");
            }
        }finally {
            lock.unlock();
        }
    }

 主从一致性

如果主节点宕机了,redis的哨兵模式会选择一个从节点作为主节点,如果有新的线程,会直接请求新的主节点,这样新的线程也会获得锁,这样会丧失锁的特性,造成脏数据。

RedLock(红锁):不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁

(n / 2 + 1),避免在一个redis实例上加锁。

缺点:高并发环境下,性能变差

 

可以使用redisson提供的红锁来解决,但是这样的话,性能就太低了,如果业务中非要保证数据的强一致性,建议采用zookeeper实现的分布式锁 

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米开浪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值