【面试高频 time:】SpringBoot整合Redisson实现分布式锁

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 【面试高频 time:】SpringBoot整合Redisson实现分布式锁

引入所需依赖包

<!--分布式锁-->
            <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson</artifactId>
                <version>3.10.1</version>
            </dependency>

编写Config配置类

此处由于我本地测试的redis没有设置密码所以取消了设置密码步骤,如果是redis集群则使用集群模式。

@Configuration
@Data
public class AppConfig {
    @Value("${spring.redis.host}")
    private String redisHost;
    @Value("${spring.redis.port}")
    private String redisPort;
//    @Value("${spring.redis.password}")
//    private String redisPwd;
    @Bean
    public RedissonClient redissionCLient() {
        Config config = new Config();
        // 单机模式
        config.useSingleServer()
//                .setPassword(redisPwd)
                .setAddress("redis://" + redisHost + ":" + redisPort);
        // 集群模式
//        config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
        return Redisson.create(config);
    }
}

编写测试案例

这里睡眠十秒钟模拟正在处理逻辑,一个线程加锁成功后正在处理逻辑还未解锁,另外一个线程准备获取锁

@ApiOperation("加锁测试")
@GetMapping("lock")
    public JsonData lock() {
        RLock lock = redissonClient.getLock("lock:coupon:19");
        lock.lock();
        try {
            // 加锁成功
            log.info("加锁成功,处理业务逻辑,线程{}",Thread.currentThread().getId());
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 解锁
            lock.unlock();
            log.info("解锁成功,其他线程可以进入,线程{}",Thread.currentThread().getId());
        }
        return JsonData.buildSuccess();
    }

启动两个端口测试

分别是9002,9005,浏览器输入测试地址进行测试

测试结果

9002处理结束之后才处理9005

参考官网地址

附加,Redisson是怎样解决分布式锁的⾥⾯的坑

问题 : Redis锁的过期时间⼩于业务的执⾏时间该如何续

期?

watch dog看⻔狗机制

负责储存这个分布式锁的Redisson节点宕机以后,⽽且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。或者业务执⾏时间过⻓导致锁过期,为了避免这种情况的发⽣,Redisson内部提供了⼀个监控锁的看⻔狗,它的作⽤是在Redisson实例被关闭前,不断的延⻓锁的有效期。Redisson中客户端⼀旦加锁成功,就会启动⼀个watchdog看⻔狗。watch dog是⼀个后台线程,会每隔10秒检查⼀下,如果客户端还持有锁key,那么就会不断的延⻓锁key的⽣存时间

默认情况下,看⻔狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另⾏指定

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
存储 Java 文件存储
Spring Boot中的分布式文件系统
Spring Boot中的分布式文件系统
|
2天前
|
NoSQL 前端开发 Java
技术笔记:springboot分布式锁组件spring
技术笔记:springboot分布式锁组件spring
|
1天前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot中的分布式缓存方案
|
1天前
|
负载均衡 NoSQL Dubbo
java分布式面试快问快答
java分布式面试快问快答
9 0
|
1天前
|
缓存 NoSQL 数据库
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)
6 0
|
1天前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
8 0
|
1天前
|
消息中间件 缓存 Java
Spring Boot最经典的20道面试题,你都会了吗?
Spring Boot最经典的20道面试题,你都会了吗?
9 0
|
1天前
|
消息中间件 Java 数据库
Spring Boot中如何实现分布式事务
Spring Boot中如何实现分布式事务
|
1天前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot中的分布式缓存方案
|
2天前
|
存储 Java 数据库
Spring Boot与分布式事务的最佳实践
Spring Boot与分布式事务的最佳实践