分布式锁学习

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分布式锁的应用

synchronized学习

Redisson分布式锁学习总结:可重入锁 RedissonLock#unlock 释放锁源码分析

JAVA线程安全学习笔记之线程安全

高效分布式锁实现(+进阶布隆过滤器)