Redis应用场景-分布式锁
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应用场景-分布式锁相关推荐
- Redlock——Redis集群分布式锁
欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...
- 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...
面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...
- Redis 集群分布式锁与 API 网关分布式限流
https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...
- Redis进阶- Redisson分布式锁实现原理及源码解析
文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...
- Redis进阶-细说分布式锁
文章目录 Pre 引 分布式锁演进 V1 分布式锁演进 V2 分布式锁演进 V3 分布式锁演进 V4 分布式锁演进 V5 终极版-分布式锁演进(Redisson ) V6 Code Redisson分 ...
- 基于 Redis 实现的分布式锁
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:我的大学到研究生自学 Java 之路,过程艰辛,不放弃,保持热情,最终发现我是这样拿到大厂 offer 的! 作 ...
- 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?
一起学习Redis | 如何利用Redis实现一个分布式锁? 前提知识 什么是分布式锁? 为什么需要分布式锁? 分布式锁的5要素和三种实现方式 实现分布式锁 思考思考 基础方案 改进方案 保证setn ...
- Redis:Redisson分布式锁的使用(推荐使用)
Redis:Redisson分布式锁的使用(生产环境下)(推荐使用) 关键词 基于NIO的Netty框架,生产环境使用分布式锁 redisson加锁:lua脚本加锁(其他客户端自旋) 自动延时机制:启 ...
- 17、Redis、Zk分布式锁实现原理
我们在编程有很多场景使用本地锁和分布式锁,但是是否考虑这些锁的原理是什么?本篇讨论下实现分布式锁的常见办法及他们实现原理. 一.使用锁的原则 使用本地锁和分布式锁是为了解决并发导致脏数据的场景,使用锁 ...
最新文章
- BigData之Hive:Hive数据管理的简介、下载、案例应用之详细攻略
- Angular2 - Starter - Routes, Route Resolver
- 傲腾内存 可以用ghost系统_玩机小贴士:Intel傲腾内存你用过没有?
- think php5是什么,thinkphp5是什么
- android 的webview解析
- Jerry Wang重装系统的一些备份
- python123第七周小测验_python+request+untitest的接口自动化测试
- C语言十五位正整数相加,二个超长正整数的相加
- YAML的扩展名是.yaml还是.yml?
- LeetCode Interleaving String
- R实践 第二篇:创建数据集
- 冒泡排序解析 + 代码实现(C语言)
- 计算机名改为名字的拼音,批量转换中文文件名为拼音
- 计算机键盘正确指法操作方法,键盘指法,图文详解键盘指法练习方法
- 2021-01-29
- 小米Android版本不不一致,小米5s卡刷包android版本不一致怎么解决
- 英特尔cpu发布时间表_2014英特尔处理器发布时间表
- python中倍数怎么表示_在Python3中如何计算字典中特定值的倍数
- 想学python网课哪个好-推荐书单(网课)-人生/编程/Python/机器学习-191本
- 突破某些网站限制只能由微信打开的尴尬场景