Redis的分布式锁

两种加锁类型:
1.JVM加锁
2.分布式微服务架构,拆分后各个微服务之间为例避免冲突和数据库故障而加入的一种锁,分布式锁。

多个服务间+保证同一个时间段内+同一个用户只能有一个请求(防止关键业务出现数据冲突和并发错误)

创建微服务的口诀:
1.建Module
2.改pom
3.写yaml
4.主启动
5.写业务
6.小测试

Synchronized:要不线程释放锁,要么报错,可能导致线程大量的积压
ReentrantLock:在规定时间内拿不到锁就放弃。tryLock
分布式加锁的问题:
1.如果在每个服务里面加锁,只是对本服务加锁,可能还是会出现超卖的情况
setIfAbsent(锁的名字,固定表示标识)
在这里插入图片描述
加锁成功之后,运行完成相应任务进行相应的删除锁操作.
1.保证出现异常也能删除锁,所以要使用 try-catch-finally
2.程序宕机了,可能无法走到finally方法,所以还是无法删除锁。这个时候需要加一个过期时间来限定key 使用:RedisTemple.expire(key,10L,TimeUtil.SECONDS) 设置10秒钟
3.redis加锁与设置过期时间如果分开的话,就不具备原子性。为了保证原子性,使用IfAbsent进行设置key与过期时间。
4.线程运行时间大于过期时间:可能先进去的线程删除了之后线程的锁,同时数据不一致。所以在删除锁之前要进行锁的判断,判断锁的值是否是当前的value,如果不是则不会删除key
5.finally与del不是原子性:解决方法是lua脚本lua脚本 如果不用lua脚本,就用redis自身的事务
在这里插入图片描述

在这里插入图片描述

redis的事务:redis事务
multi:开始事务,要么同时成功,要么同时失败。
exec:提交事务
在这里插入图片描述
在这里插入图片描述
WATCH key : 表示其他的进行不能修改key,不然就会修改失败
在这里插入图片描述
6.使用JedisPool
在这里插入图片描述

在这里插入图片描述
7.如何确保redis的过期时间大于业务执行时间,redis分布式锁如何续期。
8.redis的AP:异步复制造成的锁丢失
比如:主节点没来得及把刚set进来的数据给从节点,就挂了
zookeep的cp:
在这里插入图片描述

redis的锁:redis锁解读 redisson
在这里插入图片描述
在这里插入图片描述
避免解锁异常:解的不是自己当前的锁
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值