Redis深度历险阅读笔记(2):分布式锁

千帆竞发——分布式锁

  • 应用场景:应对并发锁的问题,多个用户的读和写并不是原子的
  • 实现:利用key+setnx(没有key才建立)操作来模拟互斥量,如
    setnx lockc true
    ...
    del lock
    
    • 问题1:如果线程执行过程中间抛出异常,那么将会导致del失败,造成死锁问题
    • 对应方案1:给key设置一个过期时间,即便中途异常退出也会删除
    	setnx lockc true
    	expire lockc 5
    
    • 问题2:这个问题比较牛角尖,但是可能会发生。因为setnx和exipre都不是原子的,如果setnx完成之后,expire完成之前,发生了异常,那仍然会出现死锁问题
    • 解决2:加入了set参数的扩展参数ex,将setexpire糅合成一条指令,这样要么执行失败直接回滚,认为未获取锁,要么执行成功。
      set lockc true ex 5 nx
    • 问题3:超时问题,如果一个线程加了锁之后,需要执行大量任务,导致在时间结束之前,锁就被释放了,这也会导致逻辑错误。
    • 解决3:使用守护线程监视任务完成情况, 如果没有完成,那么给锁进行续期

参考

  • 《Redis深度历险》
  • Redis分布式锁(二):支持锁的续期

你可能感兴趣的:(笔记,redis相关)