分布式锁

  • 获取锁,使用setnx(SetNX key val:当且当仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0)加锁,锁的value值为一个随机生成的uuid,在释放锁的时候进行判断。并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁。

    常规实现(setnx,链接

  • 普通image.png

  • 超时机制,过期时间,自动解锁,防止死锁
  • image.png
  • 续命机制,无法拿捏时间,自动续期(看们狗)

image.png

  • Redisson实现
  • redisson实现的思路就是watchDog,加锁成功同时开启守护线程。默认持有30s没过10s自动续期,服务宕机。自动失效。

image.png

  • 考虑锁失败的情况(发布订阅)
  • 加锁失败不能一直轮询查询
  • 加锁失败后,订阅锁释放的消息,自身进入阻塞状态。
  • 当持有锁的客户端释放锁的时候,发布锁释放的消息。
  • 当进入阻塞等待的其他客户端收到锁释放的消息后,解除阻塞等待状态,再次尝试加锁。

image.png

一种实现 (链接

  • 加锁

image.png

  • 获取锁

image.png

  • 解锁

image.png

缓存

  • 临时数据
  • 用户token
  • 被保人信息
  • 订单号