分布式锁
获取锁,使用setnx(SetNX key val:当且当仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0)加锁,锁的value值为一个随机生成的uuid,在释放锁的时候进行判断。并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁。
常规实现(setnx,链接)
普通
- 超时机制,过期时间,自动解锁,防止死锁
- 续命机制,无法拿捏时间,自动续期(看们狗)
- Redisson实现
- redisson实现的思路就是watchDog,加锁成功同时开启守护线程。默认持有30s没过10s自动续期,服务宕机。自动失效。
- 考虑锁失败的情况(发布订阅)
- 加锁失败不能一直轮询查询
- 加锁失败后,订阅锁释放的消息,自身进入阻塞状态。
- 当持有锁的客户端释放锁的时候,发布锁释放的消息。
- 当进入阻塞等待的其他客户端收到锁释放的消息后,解除阻塞等待状态,再次尝试加锁。
一种实现 (链接)
- 加锁
- 获取锁
- 解锁
缓存
- 临时数据
- 用户token
- 被保人信息
- 订单号