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/3的锁超时时间就去延长锁的超时时间。例如,锁超时时间设置为3秒,就是每隔1秒就去延长锁的超时时间,重设为3秒》业务代码执行完成,关闭守护线程
注意:
同于释放锁需要判断uuid,否则无论谁加锁守护线程都会重新设置锁的超时时间
守护线程在合理的时间去设置锁的超时时间
加锁的线程处理完业务后应及时销毁守护进程
问题:redis不同部署方式的问题
单机:单点故障
数据同步:解决,zookeeper,保证强一致性
- Master-Slave + Sentinel(哨兵)选举模式:master故障,数据未同步到新slave中
- Redis Cluster(集群)模式:master故障,数据未同步到新slave中