分布式锁学习
Posted hadoop-dev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式锁学习相关的知识,希望对你有一定的参考价值。
redis处理过期key的方式:
redis 当key过期的时候,会采取策略来清除掉key. 有以下三种方式: 立即清除(设置过期时间的时候,设置一下回调,当时间过期,直接删除掉key) 惰性清除(key过期的时候不会立即去清除掉key,等下次取数据的时候,判断是否过期,过期了就会删除掉key). 定时清除. redis使用的是 定时清除和惰性清除 两种策略.
关于分布式锁:
在我们的日常开发中,如果是单应用实例,为了防止并发所导致的一系列的问题,我们可以使用java中提供的那些锁机制来保障( synchronized或者reentrantlock). 但是在分布式环境中,由于会存在多个jvm进程,导致锁对象不唯一,这样java中提供的那些锁机制就没有用了,这时候我们就需要寻求分布式锁来保障 并发带来的问题.
多个线程并发执行一个方法场景.
1>>>>>如果该方法里面全部是操作数据库的一些东西, 直接使用数据库的事务并发机制来控制.不需要其他的分布式锁来保障.(单业务节点也可以使用)
2>>>>>如果是为了防止多个线程进入该方法导致数据不一致性,可以使用分布式锁.
分布式锁的实现方式:
1>基于数据库来实现. 新建一张表: id method_name 建立method_name唯一索引,由数据库来保障. 执行方法前,先必须获取到锁,insert into tb (method_name) value(method_name) 返回成功就获取到锁,没有成功就没有获取到锁,执行完的时候 删除掉这条数据,让其他线程可以开始去处理.
缺点: 数据库单点故障,万一表挂了,则整个出错. 非重入性 没有过期时间,万一内部崩溃则锁一直无法释放 非阻塞
改进:使用select.....for update 有效避免非阻塞 但是可能会锁表.
2>基于redis缓存来实现分布式锁
redis加锁的时候 setnx 和 设置有效期不能拆开,因为不是一个原子操作.正确使用
String result = jedis.set(lockKey, requestId, NX, PX, expireTime);
删除锁的时候要注意:判断一下当前对象和持有锁的对象是否一致,避免释放掉其他线程的锁.
3>基于zookeeper实现分布式锁
https://www.cnblogs.com/austinspark-jessylu/p/8043726.html
https://www.cnblogs.com/linjiqin/p/8003838.html
以上是关于分布式锁学习的主要内容,如果未能解决你的问题,请参考以下文章
Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用