分布式锁

Redis 作为分布式锁(一):SpringBoot集成Redisson分布式锁

試著忘記壹切 提交于 2019-12-04 05:48:26
文章目录 一、项目Demo 1.1 项目依赖 1.2 项目配置-redis 1.3 Redisson的配置类RedissonConfig 1.4 定义一个Loker接口,用于分布式锁的一些操作 1.5 基于Redisson的实现类RedissonLocker 1.6 定义一个分布式锁工具类LockUtil 1.7 单元测试 1.8 源码 二、Redisson 之 Redlock 2.1 基于Redis命令的分布式锁 2.2 Redlock实现 2.3 Redlock源码 2.3.1 唯一ID 2.3.2 获取锁 2.3.2 释放锁 Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。 一、项目Demo 1.1 项目依赖 <!-- 单元测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- redis --> <dependency>

Springboot 集成 Redisson 分布式锁:项目集成

风流意气都作罢 提交于 2019-12-04 05:47:59
文章目录 Springboot 集成 Redisson 分布式锁:项目集成 1、POM引入依赖 2、创建配置文件 3、编写配置类 Springboot 集成 Redisson 分布式锁:项目集成 1、POM引入依赖 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.2</version> </dependency> 2、创建配置文件 我比较喜欢用YAML 格式,所以此处使用YAML 配置文件 把该配置文件放在与 application.yml 同级的目录下 singleServerConfig : idleConnectionTimeout : 10000 pingTimeout : 1000 connectTimeout : 10000 timeout : 3000 retryAttempts : 3 retryInterval : 1500 reconnectionTimeout : 3000 failedAttempts : 3 password : ****** subscriptionsPerConnection : 5 clientName : null address : 'redis://localhost:6379'

Redisson分布式锁实现

99封情书 提交于 2019-12-04 05:47:33
转: 分布式锁和Redisson实现 概述 分布式系统有一个著名的理论CAP,指在一个分布式系统中,最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。所以在设计系统时,往往需要权衡,在CAP中作选择。当然,这个理论也并不一定完美,不同系统对CAP的要求级别不一样,选择需要考虑方方面面。 在微服务系统中,一个请求存在多级跨服务调用,往往需要牺牲强一致性老保证系统高可用,比如通过分布式事务,异步消息等手段完成。但还是有的场景,需要阻塞所有节点的所有线程,对共享资源的访问。比如并发时“超卖”和“余额减为负数”等情况。 本地锁可以通过语言本身支持,要实现分布式锁,就必须依赖中间件,数据库、redis、zookeeper等。 分布式锁特性 不管使用什么中间件,有几点是实现分布式锁必须要考虑到的。 互斥 :互斥好像是必须的,否则怎么叫锁。 死锁 : 如果一个线程获得锁,然后挂了,并没有释放锁,致使其他节点(线程)永远无法获取锁,这就是死锁。分布式锁必须做到避免死锁。 性能 : 高并发分布式系统中,线程互斥等待会成为性能瓶颈,需要好的中间件和实现来保证性能。 锁特性 :考虑到复杂的场景,分布式锁不能只是加锁,然后一直等待。最好实现如Java Lock的一些功能如:锁判断,超时设置,可重入性等。

redisson分布式锁原理

馋奶兔 提交于 2019-12-04 05:47:16
锁的原理 在Redisson中,使用key来作为是否上锁的标志,当通过getLock(String key)方法获得相应的锁之后,这个key即作为一个锁存储到Redis集群中,在接下来如果有其他的线程尝试获取名为key的锁时,便会向集群中进行查询,如果能够查到这个锁并发现相应的value的值不为0,则表示已经有其他线程申请了这个锁同时还没有释放,则当前线程进入阻塞,否则由当前线程获取这个锁并将value值加一,如果是可重入锁的话,则当前线程每获得一个自身线程的锁,就将value的值加一,而每释放一个锁则将value值减一,直到减至0,完全释放这个锁。因为底层是基于分布式的Redis集群,所以Redisson实现了分布式的锁机制。 redisson 的最基本的用法, RLock lock = redisson.getLock(“lockName”); try{ // 1. 最常见的使用方法 //lock.lock(); // 2. 支持过期解锁功能,10秒钟以后自动解锁, 无需调用unlock方法手动解锁 //lock.lock(10, TimeUnit.SECONDS); // 3. 尝试加锁,最多等待2秒,上锁以后8秒自动解锁 boolean res = lock.tryLock(2, 8, TimeUnit.SECONDS); if(res){ //成功 //处理业务 } }

redisson 分布式锁

寵の児 提交于 2019-12-04 05:45:35
###需求背景: 在分布式多机部署的情况下,我们要求某一个方法,只能同一个时间只能被一台机器的一个线程执行。 在单机中,有synchronized,读写锁等方式可以解决同步问题。 但是,这些只能作用在同一个机器上,只能保证某一个机器中的方法,不会同时执行。多台机器还是可以同时执行。 这时,就需要借助介质redisson,基于redis的分布式锁。。 前提不多说了,先安装好redis,使用的Redis主从+哨兵模式。这里多台机器安装的redis哨兵,也可以单机多端口安装 1.1首先创建RedissonManager 获取redisson package com.test.redisson.manager; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; /** * @version 1.0.0 * @description * @date 2018/05/04 16:54 **/ public class RedissonManager { private static RedissonClient redissonClient; private static Config config = new Config(); /*

SpringBoot整合redisson分布式锁

ぐ巨炮叔叔 提交于 2019-12-04 05:45:23
1、为什么要使用分布式锁 在分布式场景下为了保证数据最终一致性。在单进程的系统中,存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步(lock—synchronized),使其在修改这种变量时能够线性执行消除并发修改变量。但分布式系统是多部署、多进程的,开发语言提供的并发处理API在此场景下就无能为力了。 2.分布式锁的使用场景 电商网站用下单操作时需要使用,秒杀活动更是如此,否则会出现超卖(库存100,秒杀活动时库存变负数了 3、分布式锁的实现方式 大概有三种:1.基于关系型数据库,2.基于缓存,3基于zookeeper 大部分网站使用的是基于缓存的,有更好的性能,而缓存一般是以集群方式部署,保证了高可用性 总体来说,支持redis单实例、redis哨兵、redis cluster、redis master-slave等各种部署架构,都可以给你完美实现。 4.基于缓存redis,使用开源 redisson 实现分布式锁 5、关于redisson 锁的几点说明, 1、通过阅读redission锁的API可以得知,其获取锁释放锁的使用和JDK里面的lock很相似,底层的实现采用了类似lock的处理方式 2、redisson 依赖redis,因此使用redisson 锁需要服务端安装redis,而且redisson 支持单机和集群两种模式下的锁的实现 3

Redisson分布式锁的简单使用

江枫思渺然 提交于 2019-12-04 05:45:04
做一个积极的人 编码、改bug、提升自己 我有一个乐园,面向编程,春暖花开! 文章目录 一:前言 二:分布式锁简介 三:Redisson分布式锁的介绍和简单的使用 四:总结 五:参考博文 一:前言 我在实际环境中遇到了这样一种问题,分布式生成id的问题!因为业务逻辑的问题,我有个生成id的方法,是根据 业务标识+id 当做唯一的值! 而uuid是递增生成的,从1开始一直递增,那么在同一台机器上运行代码,加上同步方法(synchronized),这个生成id的方法就是ok! 但是因为业务扩展或者说为了安全,项目运行在两台机器上,此时单个的同步方法(synchronized或者Lock)就不能防止id的重复了!!! 要解决上面的这个问题,其他有如下解决办法! (1):每台机器生产Id的代码,key+id 可以在前加上机器编号区分,key + id — >机器唯一编号 + key + id (2):使用数据库行锁(单个数据库的是时候,如何是分布式数据库也会出现问题),在需要插入id的表加上行锁,防止数据重复导致程序异常! (3):使用分布式锁 二:分布式锁简介 网上有很多的讲解分布式锁的文章, 但是细细分析很多的代码还是有很多的问题的 ,如下代码片段摘自博文: https://my.oschina.net/91jason/blog/517996?p=1 http://blog.csdn

集成redisson分布式锁

折月煮酒 提交于 2019-12-04 05:44:38
目录 一、redisson是什么 二、为什么要用redisson分布式锁 (一)为什么用锁 (二)为什么用分布式锁 (三)为什么用redisson分布式锁 三、redisson分布式锁怎么用 (一)引入相关jar包 (二)编写配置文件 1、一般spring项目 2、springboot项目 (三)加锁解锁代码 1、加锁 2、解锁 一、redisson是什么 Redisson是架设在redis基础上的一个Java主内存网络,并且是redis官方推荐的。Redisson在基于NIO的Netty框架上,充分利用了redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。这样就使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和压法大规模分布式系统 的难度。同时结合丰富的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。 我们下面介绍的分布式锁,只是其中的一个应用。 二、为什么要用redisson分布式锁 (一)为什么用锁 锁一般用在并发情况下,我们用抢红包这个场景来分析,假设有100个人抢10个红包,假如现在还剩1个红包,但是有10个人都来抢这之后一个包,因为是并发的所有这10个人抢的时候都判断还剩一个包,但是我们的红包只剩下一个10个人都抢到了

redisson分布式锁的常用示例

夙愿已清 提交于 2019-12-04 05:44:28
模拟多线程竞争同一个资源,利用redisson分布式锁实现 public void testMultiThread() throws Exception{ final Config config = new Config(); config.useSingleServer().setAddress("192.168.3.199:6379").setConnectionPoolSize(5); //开启多线程去竞争同一个资源锁 for (int i = 0; i < 12; i++) { new Thread(new Runnable() { @SuppressWarnings("static-access") @Override public void run() { RedissonClient redisson = Redisson.create(config); RLock lock = redisson.getLock("anyLock"); //设置锁对象 boolean res = false; try { // 尝试加锁,最多等待10秒,上锁以后3秒自动解锁 res = lock.tryLock(10, 3, TimeUnit.SECONDS); if(res){//获取锁成功 try { //业务操作 Thread.currentThread().sleep(new

微服务架构——分布式锁探索

随声附和 提交于 2019-12-04 01:26:27
本问主要针对zookpeer、redis实现分布式锁进行探讨, 文中有什么不严谨之处,欢迎批评指正。 redis方面:有开源redisson的jar包供你使用。 zookpeer方面:有开源的curator的jar包供你使用 需要说明的是,Google有一个名为Chubby的粗粒度分布锁的服务,然而,Google Chubby并不是开源的,我们只能通过其论文和其他相关的文档中了解具体的细节。值得庆幸的是,Yahoo!借鉴Chubby的设计思想开发了Zookeeper,并将其开源,因此本文不讨论Chubby。至于Tair,是阿里开源的一个分布式K-V存储方案。我们在工作中基本上redis使用的比较多,讨论Tair所实现的分布式锁,不具有代表性。 因此,主要分析的还是redis和zookpper所实现的分布式锁。 1、使用分布式锁的目的: 无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作。通俗的讲,即:一个方法在高并发情况下的同一时间只能被同一个线程执行! 使用分布式锁的原因: (1)提升效率 采取锁定可以避免不必要地执行相同的工作两次(例如,一些昂贵的计算)。如果锁定失败并且两个节点最终完成相同的工作,结果是成本略有增加(最终为云服务支付的费用比您原本要多5美分)或稍有不便(例如用户最终)两次收到相同的电子邮件通知)。 (2)提升正确性