2631Day 孤尽训练营笔记分享

2631Day 孤尽训练营笔记分享,第1张

26/31Day 孤尽训练营笔记分享

       对于微服务项目来说,事务一直是比较核心的一个技术点,这篇文章将讲述有关Redis分布式锁的一些介绍

分布式锁简介

        在同一个JVM内部,大家往往采用synchronized或者Lock的方式来解决多线程间的安全问题,但是在分布式架构下,在JVM之间,那么就需要一种更加高级的锁机制,来处理种跨JVM进程之间的线程安全问题,解决方案就是:使用分布式锁。

Redis分布式锁分析   Redis分布式锁原理

        Redis分布式锁机制,主要借助setnx和expire两个命令完成

• setnx
        当key不存在,将key设置为value,存在不做任何 *** 作,返回0
• expire
        设置key过期时间

     原理解析

• key不存在时创建,并设置value和过期时间,返回值为1;成功获取到锁
• 如果key存在,则直接返回0,强锁失败
• 持有锁的线程释放锁时,手动删除key;或者过期时间到,key自动删除,锁释放

     原理解析

• 加锁的问题
  >setnx成功,expire失败,如果没有收到释放,那么这个锁永远被占用,其他线程永远也抢不到锁
• 解决方案
  >使用set的命令时,同时设置过期时间,
    命令:set lock “hello” EX 200NX
  >使用LUA脚本,将加锁的命令放在lua脚本中原子性的执行

有关redis命令补存

• EX seconds:设置失效时长,单位秒
• PX milliseco失效 nds:设置时长,单位毫秒
• NX :只在键不存在时,才对键进行设置 *** 作
• XX :只在键已经存在时,才对键进行设置 *** 作

  jedis分布式锁实现

     Redis分布式锁实现-加锁:就是调用SET key PX NX命令
        set key value [EX seconds] [PX milliseconds] [NX|XX]

     Redis分布式锁实现-解锁:正确解锁调用lus脚本进行解锁

  锁过期问题

     预估业务 *** 作10秒,锁设置20秒,各种原因,比如STW问题,业务 *** 作执行超过了20秒,业务会在无锁状态下运行,就会发生数据紊乱。
     注:STW:Java中Stop-The-world机制简称STW,常发生于fullGC,这时Java应用程序的其他所有线程都被挂起(除了垃圾收集器之外)

• 乐观锁方式,增加版本号
• watch dog 自动延期

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5574866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存