1 什么是分布式锁

多个程序之间,只有一个程序在并发情况下可以获取到锁,其它程序无法获取

2 锁行为抽象

借鉴Java Lock的抽象,大致有三种方法可以进行借鉴

获取锁,如果锁已经被其它线程获取,则进行线程等待

void lock();

释放锁

void unlock();

获取锁,但是相当于lock来说,不会直接进入等待,而是将处理权交给了开发人员

 boolean tryLock();

3 分布式锁行为抽象

3.1 lock

lock 方法的定义是如果获取不到锁,则进入等待。一直等待到获取到锁为止,这个的抽象行为

在分布式锁中是不建议使用的,所以分布式锁的行为抽象抛弃了这个特性

3.2 tryLock

 boolean tryLock();

tryLock方法尝试去获取锁,会同步返回获取结果,即使未获取成功,线程也不会进入阻塞状态

分布式锁获取的实现基于此特性实现

3.3 unlock

unlock 方式是释放锁的,分布式锁会基于此特性进行实现

4 Redis具体实现技术栈

4.1 未能及时释放锁的情况

我个人认为未能及时释放锁和死锁是两个概念,未能及时释放锁可能是程序出现异常导致

tryLock后未能调用unlock,或者程序开发的代码问题。针对这个未能及时释放锁的特性延伸出一个

不兼容的方案

4.2 未能及时释放锁的解决方案

给这个锁上一个自动的失效时间,比如上锁以后半个小时不释放锁就自动释放了

4.3 setnx 方案

原生命令   

setnx key value

setnx 当key不存在时才用赋值 ,并且会有赋值成功,赋值失败的返回

   赋值成功

(integer) 1

赋值失败

(integer) 0

问题

由于不支持失效的机制,就算使用expire命令去主动设置失效时间,但是由于是两个命令,不满

足了原子性,所以这个方案虽然可以实现分布式锁,但是可能存在忘记释放锁的机制

4.4 set key value NX PX 3000 原子操作,px 设置毫秒数

原生命令   

   

set age 18 NX PX 10000 #如果不存在赋值 有效期10秒

   赋值成功 

   

OK

 

   赋值失败

(nil)

4.5  Jedis代码实现

/**
* 使用redis的set命令实现获取分布式锁
* @param lockKey 可以就是锁
* @param requestId 请求ID,保证同一性 uuid+threadID
* @param expireTime 过期时间,避免死锁
* @return
*/
public boolean getLock(String lockKey,String requestId,int expireTime) {//NX:保证互斥性// hset 原子性操作 只要lockKey有效 则说明有进程在使用分布式锁String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime);if("OK".equals(result)) {return true;}return false;
}

Redis应用场景-分布式锁相关推荐

  1. Redlock——Redis集群分布式锁

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...

  2. 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...

    面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...

  3. Redis 集群分布式锁与 API 网关分布式限流

    https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...

  4. Redis进阶- Redisson分布式锁实现原理及源码解析

    文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...

  5. Redis进阶-细说分布式锁

    文章目录 Pre 引 分布式锁演进 V1 分布式锁演进 V2 分布式锁演进 V3 分布式锁演进 V4 分布式锁演进 V5 终极版-分布式锁演进(Redisson ) V6 Code Redisson分 ...

  6. 基于 Redis 实现的分布式锁

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:我的大学到研究生自学 Java 之路,过程艰辛,不放弃,保持热情,最终发现我是这样拿到大厂 offer 的! 作 ...

  7. 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?

    一起学习Redis | 如何利用Redis实现一个分布式锁? 前提知识 什么是分布式锁? 为什么需要分布式锁? 分布式锁的5要素和三种实现方式 实现分布式锁 思考思考 基础方案 改进方案 保证setn ...

  8. Redis:Redisson分布式锁的使用(推荐使用)

    Redis:Redisson分布式锁的使用(生产环境下)(推荐使用) 关键词 基于NIO的Netty框架,生产环境使用分布式锁 redisson加锁:lua脚本加锁(其他客户端自旋) 自动延时机制:启 ...

  9. 17、Redis、Zk分布式锁实现原理

    我们在编程有很多场景使用本地锁和分布式锁,但是是否考虑这些锁的原理是什么?本篇讨论下实现分布式锁的常见办法及他们实现原理. 一.使用锁的原则 使用本地锁和分布式锁是为了解决并发导致脏数据的场景,使用锁 ...

最新文章

  1. BigData之Hive:Hive数据管理的简介、下载、案例应用之详细攻略
  2. Angular2 - Starter - Routes, Route Resolver
  3. 傲腾内存 可以用ghost系统_玩机小贴士:Intel傲腾内存你用过没有?
  4. think php5是什么,thinkphp5是什么
  5. android 的webview解析
  6. Jerry Wang重装系统的一些备份
  7. python123第七周小测验_python+request+untitest的接口自动化测试
  8. C语言十五位正整数相加,二个超长正整数的相加
  9. YAML的扩展名是.yaml还是.yml?
  10. LeetCode Interleaving String
  11. R实践 第二篇:创建数据集
  12. 冒泡排序解析 + 代码实现(C语言)
  13. 计算机名改为名字的拼音,批量转换中文文件名为拼音
  14. 计算机键盘正确指法操作方法,键盘指法,图文详解键盘指法练习方法
  15. 2021-01-29
  16. 小米Android版本不不一致,小米5s卡刷包android版本不一致怎么解决
  17. 英特尔cpu发布时间表_2014英特尔处理器发布时间表
  18. python中倍数怎么表示_在Python3中如何计算字典中特定值的倍数
  19. 想学python网课哪个好-推荐书单(网课)-人生/编程/Python/机器学习-191本
  20. 突破某些网站限制只能由微信打开的尴尬场景

热门文章

  1. android开发之网络棋牌类在线游戏开发心得(服务器端、Java)
  2. 记录踩过的坑-WPS表格
  3. 30s教会你在Android模拟器上安装搜狗输入法
  4. PTA 7-1 老师生日
  5. 根据变形金刚电影3-D骑在奥兰多环球影城公众开放
  6. Python环境配置(最详细)
  7. 经典游戏服务器端架构概述 (2)
  8. 说菜,(¬︿̫̿¬☆)
  9. 《化工流体力学》课程笔记(二)
  10. usb计算机连接flyme8,魅族Flyme8:这3个功能非常实用,很多人不知道,太浪费了...