redis分布式锁(高并发)

redis分布式锁(高并发)

  1. redis是天生单线程特性,的内存缓存服务器,当有多个线程同时访问一台redis服务器时,redis会在内部对线程进行排队。所以redis可以用此特性进行分布式锁。
  2. 高并发的场景下,redis分布式锁很可能永久失效。
  3. redis分布式锁使用了cas算法原理。
  4. synchronized时jvm级别的锁,当项目采用集群部署的时候必须采用分布式锁。才能保证线程安全。
  5. redis设置过期时间和锁续命。过期时间防止加锁成功后如果加锁的线程由于异常不能释放锁,(宕机和抛异常)保证释放锁的代码一定执行。所以设置过期时间,开启分线程采用定时执行,重新设置锁的过期时间。分线程通过主线程锁是否还存在而存在。集群下只会有一个定时子线程。(过期时间设置不当有可能当前线程的执行时间超过过期时间,还没有执行完就释放锁了,后来的线程又可以加锁执行存在并发安全问题)
  6. 加锁和过期时间设置要保证原子性操作。
  7. 过期时间的设置大小:有可能会导致自己加的锁总会被别的线程释放(即线程还没有执行完锁已经过期了,当线程执行完时释放锁时是释放的后来线程加的锁。)。例如秒杀商品。实现:自己加的锁只能自己释放,在释放锁的时候判断是否是自己加的锁根据锁的value值clientId来判断。
  8. Redisson是实现了分布式锁的框架。

     

 

9.redis一般架构采用主从或者哨兵模式,如果主机设置了key还没有来得及同步到从节点,主节点出现宕机,主节点宕机后发生主从切换,新的线程进来后依然成功获取了锁,(要实现高可用同一时刻加锁的代码块只能由一个线程获取锁),但此时前面加锁的在主节点的线程还没有执行完。

10.也可以通过Lua脚本代码来设置expier和释放锁。

 

你可能感兴趣的:(NoSQL,redis,Java架构系列)