分布式锁Redisson 防止用户重复点击按钮实现!
一:什么事Redisson?
官网:
百度百科: Redisson是架设在Redis基础上的一个java驻内存数据网格,(In-Memory Data Grid)。【Redis官方推荐】 Redisson是基于NIO和Netty框架上,充分的利用Redis键值数据库提供的一系列优势, 在java实用工具包中,常用接口的基础上,为使用者提供了一些列的具有分布式特性的 工具类,使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程 并发系统的能力,大大降低了设计和研发大规模分布式系统难度
二:本篇文章旨在介绍Redision简单的应用(防止用户重复点击按钮实现)
1.Maven项目引入
<!-- JDK 1.8+ compatible --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.5.4</version> </dependency> <!-- JDK 1.6+ compatible --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>2.10.4</version> </dependency>
1.1 用于连接Redis服务器 创建不同的Redis Server对应的客户端对象工具类
1.2:防止用户频繁请求代码实现
public void commitUserReq(HttpServletRequest request){ final RedissonClient redisson = RedisUtils.getInstance().getRedisson(redisIp,redisPort,redisPasswd); // 防重复提交锁 RLock lock = redisson.getLock(orderId + "COMMIT_ORDER" + userId); try { boolean res = lock.tryLock(0, 10, TimeUnit.SECONDS); if (!res){ throw new SimpleMessageException("操作太频繁!"); } } catch (InterruptedException e) { e.printStackTrace(); } // 防止正在请求过程再发起请求 boolean isBack = false; RLock lock2 = redisson.getLock(orderId + "LOCK_BUTTON" + userId); lock2.lock(10,TimeUnit.SECONDS); if (redisClient.exists("BUTTON_PAY_"+ userId)){ isBack = true; }else{ redisClient.setObject("BUTTON_PAY_"+ userId,borrowId,20*60); } lock2.unlock(); if (isBack){ logger.info("系统提交已经开始"); throw new SimpleMessageException("你有请求正在处理,请20分钟后再试!"); } System.out.println("处理业务代码==========正常执行"); }