redisson

2020最新的Spring Boot 分布式锁的具体实现(内附代码)

会有一股神秘感。 提交于 2020-08-11 05:17:44
前言 面试总是会被问到有没有用过分布式锁、redis 锁,大部分读者平时很少接触到,所以只能很无奈的回答 “没有”。本文通过 Spring Boot 整合 redisson 来实现分布式锁,并结合 demo 测试结果。 首先看下大佬总结的图 正文 添加依赖 <!--redis--> <dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-data-redis </artifactId> </dependency> <!--redisson--> <dependency> <groupId> org.redisson </groupId> <artifactId> redisson-spring-boot-starter </artifactId> <version> 3.10.6 </version> </dependency> 配置信息 spring: # redis redis: host: 47.103 . 5.190 port: 6379 jedis: pool: # 连接池最大连接数(使用负值表示没有限制) max-active: 100 # 连接池中的最小空闲连接 max-idle: 10 # 连接池最大阻塞等待时间(使用负值表示没有限制)

分布式锁用 Redis 还是 Zookeeper?

家住魔仙堡 提交于 2020-08-10 07:22:46
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。 由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。 此时系统架构如下: 但是这样一来会产生一个问题:假如某个时刻,redis里面的某个商品库存为1,此时两个请求同时到来,其中一个请求执行到上图的第3步,更新数据库的库存为0,但是第4步还没有执行。 而另外一个请求执行到了第2步,发现库存还是1,就继续执行第3步。 这样的结果,是导致卖出了2个商品,然而其实库存只有1个。 很明显不对啊!这就是典型的库存超卖问题 此时,我们很容易想到解决方案:用锁把2、3、4步锁住,让他们执行完之后,另一个线程才能进来执行第2步。 按照上面的图,在执行第2步时,使用Java提供的synchronized或者ReentrantLock来锁住,然后在第4步执行完之后才释放锁。” 这样一来,2、3、4 这3个步骤就被“锁”住了,多个线程之间只能串行化执行。 但是好景不长,整个系统的并发飙升,一台机器扛不住了。现在要增加一台机器,如下图:

Redisson分布式锁

流过昼夜 提交于 2020-08-08 12:22:53
Redisson分布式 GitHub中文文档 概念:是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务 引入依赖 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.1</version> </dependency> 配置 @Configuration public class MyRedissonConfig { @Bean(destroyMethod = "shutdown") public RedissonClient redissonClient() throws IOException{ //1.配置连接 Config config = new Config(); config.useSingleServer() .setPassword("123456") //可以用"rediss://"来启用SSL连接 .setAddress("redis://123.56.16.54:6379"); //2.创建客户端 RedissonClient redissonClient= Redisson.create(config);

Redis之分布式锁实现

天大地大妈咪最大 提交于 2020-08-07 13:32:24
点赞再看,养成习惯,微信搜索【 三太子敖丙 】关注这个互联网苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 前言 上一章节我提到了基于zk分布式锁的实现,这章节就来说一下基于Redis的分布式锁实现吧。 zk实现分布式锁的传送门: zk分布式锁 在开始提到Redis分布式锁之前,我想跟大家聊点Redis的基础知识。 说一下Redis的两个命令: SETNX key value setnx 是SET if Not eXists(如果不存在,则 SET)的简写。 用法如图,如果不存在set成功返回int的1,这个key存在了返回0。 SETEX key seconds value 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。 如果 key 已经存在, setex 命令将覆写旧值。 有小伙伴肯定会疑惑万一set value 成功 set time失败,那不就傻了么,这啊Redis官网想到了。 setex 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成。 我设置了10秒的失效时间,ttl命令可以查看倒计时,负的说明已经到期了。 跟大家讲这两个命名也是有原因的,因为他们是Redis实现分布式锁的关键

Redis分布式锁

那年仲夏 提交于 2020-08-06 07:59:11
说在前面,Redis分布式锁的实现已经烂大街了。 很多人都写过博客,也有写的非常非常好的。 我这里纯属为了自己学习整理一下。 而且现在redis有一个超级牛逼的客户端 Redisson 原理主要是通过redis的nx自增来实现的。 下面就直接上代码 添加依赖 < dependency > < groupId > org . springframework . integration < / groupId > < artifactId > spring - integration - redis < / artifactId > < / dependency > < dependency > < groupId > org . springframework . boot < / groupId > < artifactId > spring - boot - starter - data - redis < / artifactId > < / dependency > 分布式锁的业务无关性完全可以抽成一个接口 public interface DistributedLockTemplate { /** * 执行方法 * @param lockId 锁id(对应业务唯一ID) * @param timeout 最大等待获取锁时间 * @param unit 等待时间单位 *

Java分布式架构下如何实现分布式锁

怎甘沉沦 提交于 2020-08-05 12:38:26
  01分布式锁运用场景   互联网秒杀,抢优惠卷,接口幂等性校验。咱们以互联网秒杀为例。   @RestController   @Slf4j   publicclassIndexController{   @Autowired   privateRedissonredission;   @Autowired   privateStringRedisTemplatestringRedisTemplate;   @RequestMapping("/deduct_stock")   publicStringdeductStock()throwsInterruptedException{   intstock=Integer.parseInt   (stringRedisTemplate.opsForValue().get("stock"));   if(stock>0){   intrealStock=stock-1;   stringRedisTemplate.opsForValue().set("stock",realStock+"");   log.info("扣减成功,剩下库存+"+realStock);   }else{   return"库存不足";   }   return"end";   }   }   上面代码假定多个线程一起进来,读到胡成果相同,写入的成果也相同

RedisTimeoutException: Unable to send command

寵の児 提交于 2020-08-04 15:06:17
应用访问redis报错如下: org.redisson.client.RedisTimeoutException: Unable to send command! Try to increase 'nettyThreads' and/or connection pool size settings Node source: NodeSource [slot=0, addr=null, redisClient=null, redirect=null, entry=MasterSlaveEntry [masterEntry=[freeSubscribeConnectionsAmount=0, freeSubscribeConnectionsCounter=value:49:queue:0, freeConnectionsAmount=18, freeConnectionsCounter=value:9994:queue:0, freezed=false, freezeReason=null, 解决方法: 设置/etc/security/limits.conf soft nofile 65535 hard nofile 65535 soft nproc 65535 hard nproc 65535 来源: oschina 链接: https://my.oschina.net/u

2020最新的Spring Boot 分布式锁的具体实现(内附代码)

喜你入骨 提交于 2020-07-28 16:24:28
前言 面试总是会被问到有没有用过分布式锁、redis 锁,大部分读者平时很少接触到,所以只能很无奈的回答 “没有”。本文通过 Spring Boot 整合 redisson 来实现分布式锁,并结合 demo 测试结果。 首先看下大佬总结的图 正文 添加依赖 <!--redis--> <dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-data-redis </artifactId> </dependency> <!--redisson--> <dependency> <groupId> org.redisson </groupId> <artifactId> redisson-spring-boot-starter </artifactId> <version> 3.10.6 </version> </dependency> 配置信息 spring: # redis redis: host: 47.103 . 5.190 port: 6379 jedis: pool: # 连接池最大连接数(使用负值表示没有限制) max-active: 100 # 连接池中的最小空闲连接 max-idle: 10 # 连接池最大阻塞等待时间(使用负值表示没有限制)