分布式锁简介:
在同一个JVM内部,大家往往采用synchronized或者L ock的方式来解决多线程间的安全问题,但是在分布式架构下,在JVM之间,那么就需要一种更加高级的锁机制, 来处理跨JVM进程之间的线程安全问题,解决方案就是:使用分布式锁。
Redis分布式锁原理:
Redis分布式锁机制,主要借助setnx和expire两个命令完成
setnx:
当key不存在,将key设置为value ,存在不做任何操作,返回0
expire:
设置key过期时间
加锁的问题
setnx成功,expire失败。如果没有手动释放,那么这个锁永远被占用,其他线程永远也抢不到锁。
解决方案:
1、使用set的命令时,同时设置过期时间,命令set lock "1234" EX 100 NX
2、使用lua脚本,将加锁的命令放在lua脚本中原子性的执行
Redisson
Redisson加锁原理:
加锁:
1.判断有没有“DISL OCK”
2.如果没有,设置UUID:1=1
3.设置它的过期时间
锁重入:
1.KEY和字段都存在,锁重入
2.执行命令incrby UUID:1 1
3.结果: DISLOCK: {UUID:1 2}
锁互斥:
1.客户端2进入
2.判断有KEY,没有字段
3.返回过期时间
4.客户端2自旋等待
Watch dog自动延期
分段锁