• SpringBoot使用分布式锁


    SpringBoot使用分布式锁

    1、介绍

    Redisson是一个基于NIO的Netty框架的企业级的开源Redis Client,也提供了分布式锁的支持,Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格框架, 充分利用 Redis 键值数据库提供的一系列优势, 基于 Java 实用工具包中常用接口, 为使用者提供了 一系列具有分布式特性的常用工具类.

    2、使用

    1、导包

    <dependency>
        <groupId>org.redissongroupId>
        <artifactId>redisson-spring-boot-starterartifactId>
        <version>3.13.6version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、创建redisson配置类

    
    import org.redisson.Redisson;
    import org.redisson.api.RedissonClient;
    import org.redisson.config.Config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class RedissonConfig {
    
        @Bean
        public RedissonClient redissonClient(){
            Config config = new Config();
            config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0);
            RedissonClient redissonClient = Redisson.create(config);
    
            return redissonClient;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3、使用

    
            //设置该商品的key
            String productKey = "product_001";
            //使用redisson获取锁
            RLock lock = redissonClient.getLock(productKey);
            try{
                //加锁
                lock.lock();
            }finally {
                //释放锁
                lock.unlock();
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    redisson所有指令都通过lua脚本执行,redis支持lua脚本原子性执行

    redisson设置一个key的默认过期时间为30s,如果某个客户端持有一个锁超过了30s怎么办?

    redisson中有一个watchdog的概念,翻译过来就是看门狗,它会在你获取锁之后,每隔10秒检查是否持有锁,如果持有则延长锁时间30s

    这样的话,就算一直持有锁也不会出现key过期了,解决其他线程获取到锁的问题了。

    redisson的“看门狗”逻辑保证了没有死锁发生。

    注意:如果机器宕机了,看门狗也就没了。此时就不会延长key的过期时间,到了30s之后就会自动过期了,其他线程可以获取到锁

    这里忽略看 //redis实现分布式锁,使用setIfAbsent方法(等同于redis中的setnx命令)
    // Boolean product001 = stringRedisTemplate.opsForValue().
    // setIfAbsent(productKey, productVal, 10, TimeUnit.SECONDS);

  • 相关阅读:
    bp神经网络算法的优缺点,bp神经网络缺点及克服
    Python实现压缩和解压缩
    6.0 生成txt、doc文件
    LeetCode每日一题(987. Vertical Order Traversal of a Binary Tree)
    ES&elasticsearch-header菜鸟教程06--模糊查询
    【API 管理】什么是 API 管理,为什么它很重要?
    编译无法加载主类的问题
    Lombok插件介绍、MyBatisPlus分页功能、控制台日志及删除banner
    神经网络图片怎么分类的,图神经网络怎么做分类
    SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.5 SpringBoot 整合 Redis
  • 原文地址:https://blog.csdn.net/weixin_49390750/article/details/126342549