两种加锁类型:
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
避免解锁异常:解的不是自己当前的锁