Redisson介绍和简单使用

目录

介绍

引入redis、redisson依赖

配置redis连接信息

配置RedisConfig

配置RedissonConfig

加解锁锁操作


 

介绍

现在项目一般都是使用分布式集群部署,对后台业务数据的某些操作需要考虑加锁的问题,而jdk的synchronize加锁机制已经不适合做集群部署的操作,因为synchronize关键字只是针对于单体部署的单台虚拟机有用。考虑到现在系统使用redis做缓存比较高效,此处推荐使用redis下的分布式锁redisson进行加锁操作。而Redisson解决了Redis基于 setnx 实现的分布式锁存在的一些问题:

  • 不可重入:同一个线程无法多次获取同一把锁(eg:方法A调用方法B,在方法A中先获取锁,然后去调用方法B,方法B也需要获取同一把锁,这种情况下如果锁不可重入,方法B显然获取不到锁,会出现死锁的情况)
  • 不可重试:获取锁只尝试一次就返回 false,没有重试机制
  • 超时释放:超时释放虽然能够避免死锁,但如果业务执行执行时间较长导致锁释放,会存在安全隐患
  • 主从一致性:主从数据同步存在延迟,比如:线程在主节点获取了锁,尚未同步给从节点时主节点宕机,此时会选一个从节点作为新的主节点,这个从节点由于没有完成同步不存在锁的标识,此时其他线程可以趁虚而入拿到锁,这就造成多个线程同时拿到锁,就会出现安全问题)

引入redis、redisson依赖

<!--redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.2.RELEASE</version>
</dependency>
<!--redisson依赖-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.4</version>
</dependency>
<!--使用redis时需要此jar包-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

配置redis连接信息

spring:
  redis:
    database: 0
    host: xx.xx.xx.xx
    port: 1316
    password: xxxx
    timeout: 3000
    lettuce:
      pool:
        max-active: 20
        max-idle: 10
        max-wait: -1
        min-idle: 0

配置RedisConfig

@Configuration
public class RedisConfig {


    Logger logger = LoggerFactory.getLogger(RedisConfig.class);


    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory) {
        logger.debug("redisTemplate实例化 {}");
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<Object>(Object.class);
        // key的序列化采用StringRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value值的序列化采用fastJsonRedisSerializer
        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // hash的value序列化方式采用fastJsonRedisSerializer
        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

配置RedissonConfig

配置RedissonClient客户端,用于加锁操作,使用@Bean注解,当程序启动时加载到spring容器中供后期使用,配置客户端需要根据redis服务的模式配置,有集群、主从、哨兵等模式,具体配置参考官网:2. 配置方法 · redisson/redisson Wiki · GitHub;此处使用的单节点模式配置。

@Configuration
public class RedissonConfig {


    //redis相关配置
    @Value("${spring.redis.host}")
    private String redisHost;


    @Value("${spring.redis.port}")
    private String redisPort;


    @Value("${spring.redis.database}")
    private int database;


    @Value("${spring.redis.password}")
    private String password;


    @Value("${spring.redis.timeout}")
    private int timeout;


    //创建redisson客户端,此时默认使用单节点
    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://"+redisHost+":"+redisPort);
        config.useSingleServer().setDatabase(database);
        config.useSingleServer().setPassword(password);
        config.useSingleServer().setTimeout(timeout);
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }
}

加解锁锁操作

​ 操作特别简单,通过RedissonClient获取锁,然后调用lock即可加锁,解锁使用unlock即可。

//在需要使用分布式锁的类里面注入RedissonClient客户端
@Autowired
RedissonClient redissonClient;


//根据锁名称获取锁
RLock lock = redissonClient.getLock("anyLock");


//加锁
// 最常见的使用方法
lock.lock();
// 加锁以后10秒钟自动解锁
lock.lock(10, TimeUnit.SECONDS);


// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
   try {
     ...
   } finally {
       //解锁
       lock.unlock();
   }
}

<think>首先,用户的问题是关于在Spring项目中配置使用Redisson Bean。用户提供了几个引用,我需要参考这些引用,但用户说这些引用仅供参考,不是真正的需求,我应该尽可能多地参考用户上一次的问题我的回答。但在这个对话中,没有历史记录,所以我只能基于当前消息。 用户的消息是:"请问如何在Spring项目中配置使用Redisson Bean"。引用中提到了Spring Boot集成Redisson的步骤。 关键点: - 引用[2]说:在Spring Boot项目中集成使用Redisson,包括添加依赖。 - 引用[1]给出了一个配置类来创建RedissonClient Bean。 - 引用[3]提到了redisson-spring-boot-starter,它提供了Spring bean如RedissonClient。 - 引用[4]讨论了数据库设置的问题。 系统级指令: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 在回答中,可能没有数学表达式,所以我不需要添加LaTeX数学格式。但为了安全,如果有数学部分,我会用。 用户的问题是关于配置使用Redisson Bean,所以重点是Spring Boot的配置。 步骤: 1. 添加依赖:基于引用[2][3],使用redisson-spring-boot-starter。 2. 配置类:基于引用[1],创建一个配置类来定义RedissonClient Bean。 3. 使用:在服务中注入RedissonClient并使用。 引用[4]提到了数据库设置的问题,但可能不是核心。 我的回答结构: - 介绍:简要解释Redisson目的。 - 步骤1:添加依赖(Maven或Gradle)。 - 步骤2:配置Redisson使用配置类或application.properties)。 - 步骤3:在代码中使用RedissonClient Bean。 - 示例代码:像示例中那样,提供代码块。 - 生成相关问题。 引用标识:在引用段落末尾添加[^n],其中n是引用编号。用户提供了引用[1]到[4],所以我应该引用这些。 在回答中,自然地添加引用标识。例如,如果我说"你可以通过自动配置的方式创建Redisson客户端",然后引用[1]。 最后,生成相关问题。 回答语言:中文。 现在,构建回答: 1. **介绍**:Redisson是一个用于RedisJava客户端,提供分布式锁、集合等功能。在Spring Boot项目中,可以通过自动配置或自定义配置来使用Redisson Bean。 2. **添加依赖**:在pom.xml中添加redisson-spring-boot-starter依赖。引用[2]提到添加依赖。 3. **配置**:可以创建一个配置类来定义RedissonClient Bean,如引用[1]所示。或者使用starter自动配置。 4. **使用**:在需要的地方注入RedissonClient并使用。 5. **代码示例**:提供配置类使用示例。 6. **相关问题**:生成3个相关问题。 代码示例: - 配置类:类似引用[1]。 - 使用:在服务中注入。 引用[3]提到starter提供了RedissonClient等bean,所以如果使用starter,可能不需要自定义配置类,除非需要定制。 引用[1]是自定义配置,引用[3]是starter自动配置。 我应该覆盖两种方式。 步骤: - 方式1:使用starter自动配置(简单)。 - 方式2:自定义配置类(灵活)。 在回答中,逐步解释。 最终回答结构: - 标题或开头:如何在Spring项目中配置使用Redisson Bean - 步骤: - 添加依赖 - 配置Redisson(自动或手动) - 使用RedissonClient - 代码块 - 相关问题 生成相关问题: - 类似示例,3个问题。 - 例如: 1. 如何配置Redisson连接池? 2. Redisson提供了哪些分布式功能? 3. 如何处理Redisson的异常? 确保在引用段落末尾添加标识。</think>### 如何在Spring项目中配置使用Redisson Bean Redisson是一个用于RedisJava客户端,提供了分布式锁、集合、映射等高级功能,在Spring项目中集成Redisson可以简化分布式系统开发。下面我将逐步指导你如何配置使用Redisson Bean,确保过程清晰可靠。配置方式主要分为两种:使用`redisson-spring-boot-starter`自动配置(推荐,简单快捷)或自定义配置类(灵活,适合高级定制)。整个过程基于Spring Boot项目,参考了相关文档最佳实践[^2][^3]。 #### 步骤1: 添加依赖 首先,在项目的`pom.xml`文件中添加Redisson的Spring Boot Starter依赖。这将自动引入Redisson核心库Spring集成支持。 ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.23.4</version> <!-- 使用最新稳定版本 --> </dependency> ``` 如果你使用Gradle,在`build.gradle`中添加: ```groovy implementation 'org.redisson:redisson-spring-boot-starter:3.23.4' ``` 添加依赖后,Maven或Gradle会自动处理库的下载类路径配置。Starter会提供`RedissonClient`、`RedisTemplate`等Bean,无需手动定义[^2][^3]。 #### 步骤2: 配置Redisson连接 配置Redis服务器地址其他参数。你可以通过Spring的`application.properties`或`application.yml`文件进行基本配置,或自定义配置类实现更精细控制。 - **方式1: 自动配置(使用Starter)** 在`application.properties`中设置Redis地址: ```properties spring.redis.address=redis://127.0.0.1:6379 # 可选:设置数据库索引,默认0 spring.redis.database=0 ``` 启动时,Starter会自动创建`RedissonClient` Bean,无需额外代码。如果使用数据库,需注意设置`spring.redis.database`属性以避免冲突[^4]。 - **方式2: 自定义配置类(手动定义Bean)** 如果需要高级配置(如连接池、集群模式),创建一个配置类: ```java 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; @Configuration public class RedissonConfig { @Value("${spring.redis.address}") // 从配置文件注入地址 private String address; @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer() // 单机模式,也支持集群或哨兵模式 .setAddress(address) .setDatabase(0); // 设置数据库索引 return Redisson.create(config); } } ``` 这种方式允许你自定义连接参数,如超时时间或密码。引用[1]提供了类似示例,但这里优化了数据库设置以避免常见问题[^1][^4]。 #### 步骤3: 在代码中使用RedissonClient 配置完成后,在Service或Controller中注入`RedissonClient` Bean,并调用其API。例如,实现一个分布式锁功能: ```java import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class DistributedLockService { @Autowired private RedissonClient redissonClient; // 注入Bean public void performTaskWithLock() { // 获取分布式锁 var lock = redissonClient.getLock("myLock"); try { lock.lock(); // 加锁 // 执行需要同步的代码,例如共享资源操作 System.out.println("Lock acquired, performing task..."); } finally { lock.unlock(); // 释放锁 } } } ``` 在这个示例中: - `@Autowired` 自动注入`RedissonClient`实例。 - `getLock()` 方法获取一个分布式锁,确保多实例环境下的线程安全。 - 使用后务必在`finally`块中释放锁,避免资源泄漏。 #### 注意事项 - **性能优化**:在高并发场景下,调整连接池参数(如`connectionPoolSize`)在配置类中设置。 - **错误处理**:捕获`RedisConnectionException`处理网络故障。 - **测试**:启动Spring Boot应用后,检查日志确认Redisson连接成功。例如: ``` 2023-10-01 INFO o.s.b.w.embedded.tomcat.TomcatWebServer - Tomcat started on port 8080 2023-10-01 INFO o.r.c.ConfigSupport - Redis address: redis://127.0.0.1:6379 ``` 如果遇到问题,检查Redis服务器是否运行,且配置地址正确。 通过以上步骤,你可以轻松地在Spring项目中集成Redisson。自动配置方式适合大多数场景,而自定义配置提供更大灵活性[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值