对于微服务项目来说,事务一直是比较核心的一个技术点,这篇文章将讲述有关Redis分布式锁的一些介绍
分布式锁简介 在同一个JVM内部,大家往往采用synchronized或者Lock的方式来解决多线程间的安全问题,但是在分布式架构下,在JVM之间,那么就需要一种更加高级的锁机制,来处理种跨JVM进程之间的线程安全问题,解决方案就是:使用分布式锁。
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命令补存
jedis分布式锁实现• EX seconds:设置失效时长,单位秒
• PX milliseco失效 nds:设置时长,单位毫秒
• NX :只在键不存在时,才对键进行设置 *** 作
• XX :只在键已经存在时,才对键进行设置 *** 作
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 自动延期
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)