分布式锁
事务
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)

浙公网安备 33010602011771号