天天看点

Redis事务的应用业务场景分析分布式锁死锁解决

分布式锁

业务场景

秒杀问题,如何防止最后一件商品不会被多人同时购买。

解决方案

  • 使用setnx 设置一个公共锁。

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功。

  • 对于返回设置成功的,拥有控制权,进行下一步具体业务操作。
  • 对于返回值设置失败的,不具有控制权,排队或者等待。

操作完毕之后,通过del键值对来释放锁。

死锁解决

业务场景

依赖分布式锁的机制,某个用户获取到锁,之后没来得及释放就挂了,如果解决。

业务分析

  • 由于锁操作由用户控制加锁解锁,必定会存在加锁后未解锁的风险。
  • 需要解锁操作不能仅依赖用户控制,系统级别要给出对应的处理方案。

解决方案

使用expir为锁key添加时间限定,到时不释放,就放弃锁。

expire lock-key second
pexpire lock-key milliseconds
           

由于操作通常都是微秒或者毫秒级的, 因此该锁定时间不宜设置过大,具体时间根据业务设定。

  • 例如持有锁的操作最长执行时间127ms,最短执行时间7ms。
  • 测试百万次最长执行时间对应命令的最大耗时,此时百万次网络延迟平均耗时。
  • 锁时间设定推荐:最大耗时 * 1.2 + 平均网络延迟 * 1.1