基于 Redis 分布式锁
1、主流分布式锁实现方案
基于数据库实现分布式锁
基于缓存(redis 等)
基于 Zookeeper
2、根据实现方式分类 :
- 类 CAS 自旋式分布式锁:询问的方式,类似 java 并发编程中的线程获询问的方式尝试加锁,如 mysql、redis。
- event 事件类型分布式锁: event 事件通知进程后续锁的变化,轮询向外的过程,如 zookeeper、etcd*
3、Redis 实现分布式锁流程

- 设置过期时间,自动释放锁,为了解决业务异常而导致锁无法释放。(但是当业务运行超过过期时间时,开辟监控线程增加该业务的运行时间,直到运行结束,释放锁。)
- 锁和过期时间一起设置保证两者原子性
- uuid, 手动释放锁前获取锁的值,防止误删锁
4、实现伪代码
public void redisLock() throws InterruptedException {
String uuid = UUID.randomUUID().toString();
ValueOperations ops = redisTemplate.opsForValue();
Boolean lock = ops.setIfAbsent("lock", uuid, 3000, TimeUnit.SECONDS);
if (lock) {
System.out.println("执行业务代码");
if (uuid.equals(ops.get("lock"))) {
redisTemplate.delete("lock");
}
} else {
Thread.sleep(100);
redisLock();
}
}
基于 Redis 分布式锁的更多相关文章
- RedLock.Net - 基于Redis分布式锁的开源实现
工作中,经常会遇到分布式环境中资源访问冲突问题,比如商城的库存数量处理,或者某个事件的原子性操作,都需要确保某个时间段内只有一个线程在访问或处理资源. 因此现在网上也有很多的分布式锁的解决方案,有数据 ...
- c# 基于redis分布式锁
在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量. 而同步的本质是通过锁来实现的.为了实现多个线程在 ...
- 基于Redis分布式锁(获取锁及解锁)
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可用性( ...
- 基于Redis分布式锁的正确打开方式
分布式锁是在分布式环境下(多个JVM进程)控制多个客户端对某一资源的同步访问的一种实现,与之相对应的是线程锁,线程锁控制的是同一个JVM进程内多个线程之间的同步.分布式锁的一般实现方法是在应用服务器之 ...
- 基于redis分布式锁实现“秒杀”
转载:http://blog.5ibc.net/p/28883.html 最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路. 业务场 ...
- 基于redis分布式锁实现“秒杀”(转载)
转载:http://blog.csdn.net/u010359884/article/details/50310387 最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的de ...
- 分布式-技术专区-Redis分布式锁实现-第一步
承接前面一篇Redis分布式锁的原理介绍 https://www.cnblogs.com/liboware/p/11921759.html 我们针对于实现方案进行接下来上篇进行重新的规划和定义以及完善 ...
- 基于SpringBoot AOP面向切面编程实现Redis分布式锁
基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式锁 基于SpringBoot AOP面向切面编程实现Redis分布式 ...
- Redis分布式锁,基于StringRedisTemplate和基于Lettuce实现setNx
使用redis分布式锁,来确保多个服务对共享数据操作的唯一性一般来说有StringRedisTemplate和RedisTemplate两种redis操作模板. 根据key-value的类型决定使用哪 ...
随机推荐
- PhpMyadmin后台拿webshell方法总结
前言: phpmyadmin后台拿webshell的方法主要分为两个方法: (1) .通过日志文件拿webshell; (2) .利用日志文件写入一句话;(这个方法可能在实际操作中会遇到困难): 本地 ...
- Windows 7/8 64位系统 不能注册32位dll 文件的解决方案
这几天碰到一个问题,运行一个易语言开发的软件出现以下错误.我的系统是 Windows7 64 位 专业版.在系统盘 windows/system32 下查找 dm.dll.但是没有这个文件.于是我到 ...
- HTTP 错误 500.21 - Internal Server Error 解决方案【转】
HTTP 错误 500.21 - Internal Server Error 解决方案: 今天在测试网站的时候,在浏览器中输入http://localhost/时,发生如下错误: HTTP Erro ...
- MVC 生成安全验证码(例:用于登陆验证)(转)
---------html <td>验证码:</td> <td> <img src="/Login/CheckCode?ID=1" id= ...
- 半吊子菜鸟学Web开发 -- PHP学习5-数据库
数据库 1 进行数据库操作的步骤 连接数据库 mysqli_connect 选择数据库 mysqli_select_db 设置文件编码 mysqli_query("set name utf- ...
- springboot项目yml中使用中文注释报错的解决方法1
启动springboot项目时报错:/application.yml.....这大致就是说application.yml有问题,那么目前我所知道的大致两种情况会报错,第一种是yml格式有问题,要注意缩 ...
- Oracle数据常用的备份与恢复?
Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归 ...
- (转载)MySQL删除所有表的外键约束、禁用外键约束
其实如果想删除所有表可以直接如下操作: 在navicat中直接选中所有表,然后右键删除表即可,会有提示,一路确定,就会先删掉没有外键的表和字表,只要一路确定,删几批就把表都删完了,并不算太麻烦. 转: ...
- Redis 是单进程单线程的?
Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消 除了传统数据库串行控制的开销.
- 学习 Haproxy (六)
HAProxy HAProxy是免费 高效 可靠的高可用及负载均衡解决方案,该软件非常适合于处理高负载站点的七层数据请求,HAProxy的工作模式使其可以非常容易且安全地集成到我们现有的站点架构中.使 ...