当前位置:网站首页>Redisson实现分布式锁
Redisson实现分布式锁
2022-08-02 08:00:00 【暮晓引流软件】
1、Redisson简介
Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java 提供原生支持。
相反,作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。而 Redisson 就是用于在 Java 程序中操作 Redis 的库,它使得我们可以在程序中轻松地使用 Redis。Redisson 在 java.util 中常用接口的基础上,为我们提供了一系列具有分布式特性的工具类。
Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。
2、Redisson实现分布式锁的步骤
**2.1.**引入依赖
引入重要的两个依赖,一个是spring-boot-starter-data-redis,一个是redisson:
<!--导入Lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--Spring Data Redis 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.7.5</version>
</dependency>
2.2.application.properties
# Redis服务器地址
spring.redis.host=192.168.3.28
# Redis服务器连接密码(默认为空)
spring.redis.password=
# Redis服务器连接端口
spring.redis.port=6379
2.3.Redisson的配置类
创建一个redisson的配置类RedissonConfig,内容如下:
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
public class RedissonConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
//@Value("${spring.redis.password}")
//private String password;
/**
* RedissonClient,单机模式
* @return
* @throws IOException
*/
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() throws IOException {
Config config = new Config();
//config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);
config.useSingleServer().setAddress("redis://" + host + ":" + port);
return Redisson.create(config);
}
}
2.4.Redisson分布式锁业务类
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class SkillService {
@Resource
RedissonClient redissonClient;
private final static String LOCK_KEY = "RESOURCE_KEY";
int n = 500;
public void seckill() {
//定义锁
RLock lock = redissonClient.getLock(LOCK_KEY);
//lock.lock();
try {
//尝试加锁,最大等待时间300毫秒,上锁30毫秒自动解锁
if (lock.tryLock(300, 30, TimeUnit.MILLISECONDS)) {
log.info("线程:" + Thread.currentThread().getName() + "获得了锁");
log.info("剩余数量:{}", --n);
}
} catch (Exception e) {
log.error("程序执行异常:{}", e);
} finally {
log.info("线程:" + Thread.currentThread().getName() + "准备释放锁");
//释放锁
lock.unlock();
}
}
}
2.5.Redisson分布式锁测试
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SkillServiceTest {
@Autowired
SkillService service;
@RequestMapping("/testSkillService")
public void TestSkillService(){
for (int i = 10; i < 60; i++) { //开50个线程
SkillThread skillThread = new SkillThread(service, "skillThread->" + i);
skillThread.start();
}
}
}
class SkillThread extends Thread {
private SkillService skillService;
public SkillThread(SkillService skillService, String skillThreadName) {
super(skillThreadName);
this.skillService = skillService;
}
@Override
public void run() {
skillService.seckill();
}
}
测试结果如下:

全部都是按照顺序依次执行。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 按键控制流水灯(计时器)
- Axial Turbine Privacy Policy
- Ansible learning summary (11) - detailed explanation of forks and serial parameters of task parallel execution
- Biotin - LC - Hydrazide | CAS: 109276-34-8 | Biotin - LC - Hydrazide
- [OC学习笔记]weak的实现原理
- 多表的查询
- Elasticserch 自定义字段,用户会频繁的创建和删除字段,怎么设计mapping?
- 传递泛型给JSX元素
- 17、生成长图,并上传至服务器
- 为什么都推荐使用wordpress, 而不是 phpcms 这些国内的CMS呢?
猜你喜欢
随机推荐
Technology Cloud Report: To realize the metaverse, NVIDIA starts from building an infrastructure platform
@RequestParam使用
血气方刚的年轻小伙竟去做家政小哥,是怎样成功逆袭转行的
BGP通过MPLS解决路由黑洞
Biotin hydrazide HCl|CAS:66640-86-6|生物素-酰肼盐酸盐
Flink 程序剖析
Spark 系统性学习笔记系列
Ansible learning summary (11) - detailed explanation of forks and serial parameters of task parallel execution
传递泛型给JSX元素
HCIP第一天
Figure robot software digital twin station oil and gas pipelines, oil and gas transportation control platform
Shell becomes canonical and variable
Axial Turbine Privacy Policy
构建Flink第一个应用程序
用户身份标识与账号体系实践
Write a small game in C (three chess)
商业智能平台BI 商业智能分析平台 如何选择合适的商业智能平台BI
uni.navigateBack 中的坑
Biotin-LC-Hydrazide|CAS:109276-34-8|生物素-LC-酰肼
mysql去除重复数据

![[ansible]playbook结合项目解释执行步骤](/img/fe/82b8562075fef33490d5aae7e809f5.png)







