20_springboot整合redisson

1. 如何使用

1.1 引入依赖

    <dependencies>
        <!-- 以后使用Redisson作为所有分布式锁 -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>

1.2 配置redisson

  • 可以通过配置文件配置,也可以通过配置类配置。下面讲配置类配置
  • 创建配置类

@Configuration
public class MyRedissonConfig {
    /**
     * 所有对Redisson的使用都是通过RedissonClient
     * @return
     * @throws IOException
     */
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson() {
        //1 .创建配置,redisson包下的config类
        Config config = new Config();

        // 集群模式
        //config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");

        // 单机模式
        //Redis url should start with redis:// or rediss://
        config.useSingleServer().setAddress("redis://10.128.240.183:6380");

        //2. 根据config创建出redissonClient实例 
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
    }
}

1.3 测试配置是否成功

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimallProductApplicationTests {
    @Autowired
    RedissonClient redissonClient;
    // 测试是否redissonClient配置成功
    @Test
    public void testRedisson() {
        System.out.println(redissonClient);

    }
}

1.4 基于redisson实现要给分布式锁


@Controller
public class IndexController {

    @Autowired
    private RedissonClient redisson;


    @ResponseBody
    @GetMapping("/hello")
    public String hello() {

        //1. 获取一把锁,只要锁的名字一样,就是同一把锁
        RLock myLock = redisson.getLock("my-lock");

        //2. 加锁
        myLock.lock();  // 阻塞式等待,默认加的锁都是30秒
        try {
            System.out.println("加锁成功,执行业务。。。" + Thread.currentThread().getId());
            try {
                TimeUnit.SECONDS.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }finally {
            //3. 解锁,假设解锁代码没有允许,Redisson会不会出现死锁:不会
            System.out.println("释放锁。。。" + Thread.currentThread().getId());
            myLock.unlock();
        }
        return "hello";
    }

}

2. 关于Redisson的一些解释

2.1 redisson的分布式锁

  • 还是基于redis的setnx指令实现
  • 阻塞式等待,加锁默认加锁时间是30秒
  • 锁具有自动续期(看门狗机制)的功能,如果业务超长,运行期间自动锁上新的30s。所以不用担心业务时间长,而导致锁自动过期被删掉
  • 加锁的业务只要运行完成,就不会给当前锁续期了,即使不手动解锁,锁默认也会在30s内自动过期,不会产生死锁问题
  • myLock.lock(10,TimeUnit.SECONDS);   //10秒钟自动解锁,自动解锁时间一定要大于业务执行时间

2.2 分布式锁的自动续期

  • 如果我们加锁的时候设置了释放所得时间,如myLock.lock(10,TimeUnit.SECONDS); 则不会有自动续期功能
    • 本质就是给redis发送一个lua脚本
  • 如果加锁时候没有设置自动释放时间,需要手动解锁,则会有一个看门狗机制(其原理就是启动定时任务给锁重新设置过期时间:默认10s执行一次定期任务进行锁续期,续期成锁过期时间为30秒),锁默认设置30秒超时时间,当快到期且业务还没完成则会自动续期

SpringBoot中使用Redisson(集群版)可以使用以下步骤: 1. 添加Redisson依赖 在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>${redisson.version}</version> </dependency> ``` `${redisson.version}`是Redisson版本号,可以根据需要进行修改。 2. 配置RedissonSpringBoot中配置Redisson可以通过自定义配置类实现,示例代码如下: ```java @Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.database}") private int database; @Value("${spring.redis.timeout}") private int timeout; @Bean(destroyMethod = "shutdown") public RedissonClient redisson() { Config config = new Config(); config.useClusterServers() .addNodeAddress("redis://host1:port1", "redis://host2:port2") .setPassword(password) .setDatabase(database) .setConnectTimeout(timeout) .setRetryInterval(5000) .setRetryAttempts(3) .setMasterConnectionMinimumIdleSize(10) .setMasterConnectionPoolSize(64) .setSlaveConnectionMinimumIdleSize(10) .setSlaveConnectionPoolSize(64) .setLoadBalancer(new RoundRobinLoadBalancer()); return Redisson.create(config); } } ``` 其中,`host`、`port`、`password`、`database`、`timeout`等属性可以从`application.properties`文件中获取。 `config.useClusterServers()`方法表示使用Redis集群模式,`addNodeAddress()`方法用于添加Redis节点地址,可以添加多个节点。其他方法则是对Redisson连接池的配置,可以根据需要进行修改。 3. 使用Redisson 在需要使用Redisson的地方注入`RedissonClient`,示例代码如下: ```java @Service public class UserService { @Autowired private RedissonClient redissonClient; public void addUser(User user) { RMap<String, User> map = redissonClient.getMap("users"); map.put(user.getId(), user); } public User getUser(String id) { RMap<String, User> map = redissonClient.getMap("users"); return map.get(id); } } ``` 以上示例代码中,使用`redissonClient.getMap("users")`获取名为`users`的Redisson Map对象,然后可以使用Map对象进行Redis数据操作。 注意:在使用Redisson时,需要保证RedissonClient的单例,否则可能会出现连接泄漏等问题。可以使用SpringBoot的`@Scope("singleton")`注解或者将`RedissonClient`对象定义为静态变量来实现单例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值