当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
prometheus monitoring mysql_galera cluster
HCIP第二天
Biotin-EDA|CAS:111790-37-5| 乙二胺生物素
Biotin-C6-amine|N-biotinyl-1,6-hexanediamine|CAS: 65953-56-2
Visual Analysis of DeadLock
MySQL优化之慢日志查询
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
如何建立私域流量?私域流量对企业有什么好处?
Three types of [OC learning notes] Block
PostgreSQL learning summary (11) - PostgreSQL commonly used high-availability cluster solutions
随机推荐
学习笔记(7)Funtion
Mysql各个大版本之间的区别
MFC最详细入门教程[转载]
prometheus monitoring mysql_galera cluster
MySQL优化:从十几秒优化到三百毫秒
轴流式水轮机隐私政策
Button to control the running water light (timer)
静态路由综合实验
下一个排列
What is NoSQL?Databases for the cloud-scale future
Biotin-C6-amine|N-biotinyl-1,6-hexanediamine|CAS: 65953-56-2
科技云报道:实现元宇宙,英伟达从打造基础建设平台开始
@Repository详解
多表的查询
@PostConstruct注解详解
cas:139504-50-0 美登素DM1|Mertansine|
@RequestBody使用
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
理论问题与工程问题的差异在哪里?
三维体尺测量