在同一个JVM 内部,大家往往采用synchronized 或者Lock 的方式来解决多线程间的安全问题,但是在分布式架构下,在JVM 之间,那么就需要一种更佳高校的锁机制,来处理这种跨JVM 进程之间的线程安全问题,解决方案就是: 使用分布式锁。
Redis分布式锁原理
Redis 分布式锁机制,主要借助setnx 和 expire 两个命令完成。
- setnx 当key 不存在,将key 设置为value, 存在不做任何操作,返回0.
- expire 设置key 过期时间。
原理解析: - key 不存在时创建,并设置value 和过期时间,返回值为1, 成功获取到锁。
如key 存在时直接返回0,抢锁失败。
持有锁的线程释放锁时,手动删除key, 或者过期时间到,key 自动删除,锁释放。
set key value[Ex seconds] [PX millisecomds] [NX|XX]
EX second: 设置失效时长, 单位秒
milliseco 失效 nds: 设置时长,单位毫秒
key 不存在时设置value, 成功返回OK ,失败返回nil
XX key 存在时设置valuem, 成功 返回OK ,失败返回nil
Jedis 分布式锁实现
Redisson分布式锁set key value [EX seconds] [PX millseconds] [NX|NX] key 加锁的key
value UUID.randomUUID().tostring(). 代表加锁的客户端请求标识。 nxxx nx 表示SET IF
NOT EXIS 可以使用T expx PX 表示毫秒 time: 表示过期时间
Redisson 是 基于 Netty的Redis 客户端。不但能操作原生的Redis 数据结构,还为使用者提供了一系列具有分布式特性的常用工具类,实现了分布式锁。
Redisson 分布锁原理
加索
- 判断有没有 “DISLOCK”
- 如果没有,设置UUID:1 = 1
- 设置它的过期时间
锁重入 - key 和字段都存在,锁重入
- 执行命令incrby UUID:1 1
- 结果:DISLOCK: {UUID: 1 2}
锁互斥
1 .客户端2 进入 - 判断有KEY,没有字段
- 返回过期时间
- 客户端2 自旋等待
初始化分段锁库存。
分段锁扣减库存。
参考:开课吧-刘雪松老师的讲义。



