分布式锁

事务

Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然 后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

分布式锁

synchronized是jvm级别的锁,如果只有一台服务器可以使用,但是如果是分布式系统,JVM级别的锁就不在适用,此时可以使用分布式锁。

使用 setnx 设置一个公共锁 setnx lock-key value

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
  • 对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
  • 对于返回设置失败的,不具有控制权,排队或等待

问题:依赖分布式锁的机制,某个用户操作时对应客户端宕机,且此时已经获取到锁。如何解决

  • expire lock-key second
  • 但是如果是先 setnx 然后设置expire,并不能保证原子性,这样如果在expire前就宕机,stringRedisTemplate已经有原子性的实现stringRedisTemplate.opsForValue.setIfAbsent(key,value,timeout) stringRedisTemplate.delete(key)
  • 此时,如果业务时间超过锁的失效时间,业务未做完时,锁已经失效了,这个时候释放锁,释放的是下一个锁,所以还要加上一个标识符判断是否是当前的锁(可以是订单号或者用户ID)
posted @ 2020-02-17 19:21  程序员自习室  阅读(127)  评论(0)    收藏  举报