分布式锁问题相关视频教程(来自动力节点):https://www.bilibili.com/video/BV1Uz4y1X72A
相关资料下载:http://www.bjpowernode.com/?cnblogs
一、什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁 。
- 线程锁:主要用来给方法、代码块加锁 。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段 。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state) 。
- 进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁 。
- 分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问 。
如果是单机情况下(单JVM),线程之间共享内存,只要使用线程锁就可以解决并发问题 。
如果是分布式情况下(多JVM),线程A和线程B很可能不是在同一JVM中,这样线程锁就无法起到作用了,这时候就要用到分布式锁来解决 。
三、分布式锁的实现分布式锁实现的关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息,这时候我们很容易就想到了Redis 。首先我们要搭建一个Redis服务器,用Redis服务器来存储锁信息 。
在实现的时候要注意的几个关键点:
1、锁信息必须是会过期超时的,不能让一个线程长期占有一个锁而导致死锁;
2、同一时刻只能有一个线程获取到锁 。
几个要用到的redis命令:
- setnx(key, value):“set if not exits”,若该key-value不存在,则成功加入缓存并且返回1,否则返回0 。
- get(key):获得key对应的value值,若不存在则返回nil 。
- getset(key, value):先获取key对应的value值,若不存在则返回nil,然后将旧的value更新为新的value 。
- expire(key, seconds):设置key-value的有效期为seconds秒 。
- 【token为什要存在redis中 『Redis』什么是分布式锁?如何实现?】数据库乐观锁;
- 基于Redis的分布式锁;
- 基于ZooKeeper的分布式锁 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
