分布式锁在日常开发中,用处非常的多。包括但不限于抢红包,秒杀,支付下单,幂等,等等场景。
分布式锁的实现方式有多种,包括redis实现,mysql实现,zookeeper实现等等。而其中redis非常适合作为分布式锁使用,并且在各个公司都大规模的使用。
本文将由浅入深的探究Redis分布式锁的实现,最终实现一个可工业使用的Redis分布式锁。欢迎大家一步一步跟读,一起学习一起进步。
什么是分布式锁
分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。
举一个最简单的例子。有一个数据库字段status=0,表示初始状态。只有在status=0初始状态。才能修改这个值。现在有两个人,张三和李四。
- 张三,发起请求将status=0 修改为 status=1
- 李四,发起请求将status=0 修改为 status=2
因为只有status=0才会修改,代码在修改之前都会去查询status的值,并且判断是否为0。如果为0才会去更新,不为0,则拒绝更新。这其实就是一个幂等的实现。
- 假如没有分布式锁。短时间内请求两次,此时两次都获取status=0,一个修改成了1,一个修改成了2。破坏代码逻辑,有问题
- 假如加上分布式锁。短时间内请求两次,只有第一笔请求结束之后,第二笔才会执行。也就是第二笔获取status,只能获取到最新的值,比如status=1,则不修改。
Redis分布式锁方案一:SETNX (不推荐)
public String lockA(String key) {String val = UUID.randomUUID().toString();// set k v nx 如果不存在则设置成功,如果存在则设置失败boolean success = stringRedisTemplate.opsForValue().