• 分布式锁与redisson


    Redisson

    官网
    代码

    redisson提供了基于redis的强大封装
    redisson主要问题也就是“Redis分布式锁最大问题”

    支持使用的分布式对象:Topic。布隆过滤器Boom Filter。AtomicLong。。。
    分布式集合:Map…
    分布式锁(Lock)和同步器(Synchronizer): CountDownLatch…
    分布式服务: Scheduler Service

    分布式锁

    追求强一致性:使用Zookeeper
    追求性能:选择Redis,推荐Redisson
    Redis分布式锁最大问题在于:主从模式/集群模式下,master节点宕机,节点数据同步不及时造成数据丢失

    创建锁:锁名和UUID,锁失效时间
    获取锁:线程尝试获取锁时间
    释放锁:在finally中释放锁,使用UUID确定释放同一把锁

    Redis2.6.12=-
    创建锁:setnx lockname uuid;expire lockname 10;两个命令,使用lua脚本保证原子性
    获取锁:setnx 不存在才能够设置成功
    释放锁:在finally中操作;get lockname 获取uuid,判断是不是同1个uuid;再 del lockname;两个命令,使用lua脚本保证原子性

    Redis2.6.12=+
    创建锁:SET lockname uuid EX 10 NX
    获取锁:SET操作成功后,返回的是OK,失败返回NIL
    释放锁:在finally中操作;get lockname 获取uuid,判断是不是同1个uuid;再 del lockname;两个命令,使用lua脚本保证原子性

    EX seconds:设置键的过期时间为second秒
    PX millisecounds:设置键的过期时间为millisecounds 毫秒
    NX:只在键不存在的时候,才对键进行设置操作
    XX:只在键已经存在的时候,才对键进行设置操作
    SET操作成功后,返回的是OK,失败返回NIL

    问题:为什么要使用uuid

    那个线程加的锁,那个线程自己释放。
    锁有自己的超时时间,超过这个时间,锁会自己释放。
    当A线程的执行时间超过锁自己释放的时间,B线程可获取锁,A刚好执行完则释放了B加的锁
    
    • 1
    • 2
    • 3

    问题:锁超时时间的设置,设置为多少合适
    []

    操作:
    加锁成功》启动一个守护线程》每隔1/3的锁超时时间就去延长锁的超时时间。例如,锁超时时间设置为3秒,就是每隔1秒就去延长锁的超时时间,重设为3秒》业务代码执行完成,关闭守护线程
    	
    注意:
    同于释放锁需要判断uuid,否则无论谁加锁守护线程都会重新设置锁的超时时间
    守护线程在合理的时间去设置锁的超时时间
    加锁的线程处理完业务后应及时销毁守护进程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    问题:redis不同部署方式的问题

    单机:单点故障
    数据同步:解决,zookeeper,保证强一致性
    - Master-Slave + Sentinel(哨兵)选举模式:master故障,数据未同步到新slave中
    - Redis Cluster(集群)模式:master故障,数据未同步到新slave中
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    更多了解 Python: 一些有趣的知识介绍
    k8s 读书笔记 - 深入掌握 Pod
    js制作选项卡:实现点击选项卡会跳转到相应的页面
    我不写单元测试,被批了
    android-jain-sip-ri
    WebGL 视图矩阵、模型视图矩阵
    I2C子系统-应用视角
    Linux 下孤儿进程与僵尸进程详解
    mysql的索引与锁(高性能mysql必备)
    JAVAWEB_实验二 JSP 的内置对象
  • 原文地址:https://blog.csdn.net/baidu_35805755/article/details/127929636