Redis 客户端之Lettuce配置使用(基于Spring Boot 2.x)

开发环境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8
Spring Boot 从 2.0版本开始,将默认的Redis客户端Jedis替换问Lettuce,下面描述Lettuce的配置使用。

1.在项目的pom.xml文件下,引入Redis在Spring Boot 下的相关Jar包依赖。

    properties>
        <redisson.version>3.8.2</redisson.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
    </dependencies>

2.在项目的resources目录下,在application.yml文件里添加lettuce的配置参数。

#Redis配置
spring:
  redis:
    database: 6  #Redis索引0~15,默认为0
    host: 127.0.0.1
    port: 6379
    password:  #密码(默认为空)
    lettuce: # 这里标明使用lettuce配置
      pool:
        max-active: 8   #连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms  #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 5     #连接池中的最大空闲连接
        min-idle: 0     #连接池中的最小空闲连接
    timeout: 10000ms    #连接超时时间(毫秒)

3.添加Redisson的配置参数读取类RedisConfig

package com.dbfor.redis.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * RedisTemplate配置
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        // 配置redisTemplate
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//value序列化
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

4.构建Spring Boot的启动类RedisApplication

package com.dbfor.redis;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RedisApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class);
    }
}

5.编写测试类RedisTest

package com.dbfor.redis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
@Component
public class RedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void set() {
        redisTemplate.opsForValue().set("test:set1", "testValue1");
        redisTemplate.opsForSet().add("test:set2", "asdf");
        redisTemplate.opsForHash().put("hash1", "name1", "lms1");
        redisTemplate.opsForHash().put("hash1", "name2", "lms2");
        redisTemplate.opsForHash().put("hash1", "name3", "lms3");
        System.out.println(redisTemplate.opsForValue().get("test:set"));
        System.out.println(redisTemplate.opsForHash().get("hash1", "name1"));
    }
}

6.在Redis上查看运行结果

在这里插入图片描述
从上图可以看到,Lettuce配置操作数据库成功!

其他Redis客户端:
Redis 客户端之Redisson 配置使用(基于Spring Boot 2.x)

<think> 我们正在讨论的是在Spring Boot应用中使用配置类来获取Redis参数值的情况。用户的问题是:是否需要根据Spring Boot 2.x和3.x的不同版本,在配置类中编写不同的代码来获取Redis参数? 回顾之前的讨论,我们知道Spring Boot 2.x和3.x在配置文件中的属性前缀发生了变化: - Spring Boot 2.x: `spring.redis.*` - Spring Boot 3.x: `spring.data.redis.*` 那么,在配置类中,我们通常使用`@ConfigurationProperties`注解来绑定属性。因此,这个注解的前缀也需要随之改变。 因此,答案是:**是的,需要区分版本,因为配置类中属性绑定的前缀不同。** 接下来,我们分别给出两个版本的配置类示例: ### Spring Boot 2.x 配置类示例 在Spring Boot 2.x中,我们使用`spring.redis`前缀,因此配置类如下: ```java @Configuration @ConfigurationProperties(prefix = "spring.redis") // 前缀为spring.redis public class RedisPropertiesConfig { private String host; private int port; private String password; // 其他属性如database, timeout, pool配置等 // 省略getter和setter } ``` ### Spring Boot 3.x 配置类示例 在Spring Boot 3.x中,前缀改为`spring.data.redis`,因此配置类需要调整前缀: ```java @Configuration @ConfigurationProperties(prefix = "spring.data.redis") // 注意前缀的变化 public class RedisPropertiesConfig { private String host; private int port; private String password; // 其他属性 // 省略getter和setter } ``` 这样,当我们在配置文件中按照对应版本的前缀配置时,配置类就能正确绑定属性。 ### 注意事项 1. **版本兼容性**:如果你的项目从Spring Boot 2.x升级到3.x,那么配置类中的前缀必须修改,否则无法注入属性值。 2. **属性名称**:除了前缀变化,属性名称(如`host`、`port`)本身并没有改变,所以配置类中的字段名可以保持不变。 3. **配置类的位置**:确保配置类能被Spring扫描到(例如放在主应用的同包或子包下)。 ### 多环境配置 无论是单机还是集群环境,配置类都是通用的,因为绑定的是属性值。但在集群模式下,你可能需要更复杂的配置(比如节点列表),这时你可以使用`RedisClusterConfiguration`,但属性绑定原理相同。 ### 如何避免版本切换导致的错误? 可以使用Maven或Gradle的profile功能,根据不同的Spring Boot版本指定不同的配置文件,或者在配置类中使用条件注解(如`@ConditionalOnProperty`)来灵活绑定。 ### 总结 | Spring Boot版本 | 配置文件前缀 | 配置类注解前缀 | |----------------|--------------------|----------------------| | 2.x | `spring.redis` | `@ConfigurationProperties(prefix="spring.redis")` | | 3.x | `spring.data.redis`| `@ConfigurationProperties(prefix="spring.data.redis")` | 因此,在编写配置类时,必须根据使用Spring Boot版本设置正确的注解前缀。 §§相关问题§§ 1. Spring Boot 3.x中还有哪些配置属性的前缀发生了变化? 2. 如何在一个配置类中同时兼容Spring Boot 2.x和3.x? 3. 除了使用`@ConfigurationProperties`,还有哪些方式可以读取Redis配置? 4. 在集群环境下,配置类如何绑定多个节点信息? </think> 在使用配置类获取 Redis 参数值时,**需要根据 Spring Boot 2.x 和 3.x 版本进行不同的配置**,主要差异体现在配置前缀和属性绑定方式上。以下是具体分析: --- ### 🔧 核心差异说明 | **配置要素** | **Spring Boot 2.x** | **Spring Boot 3.x** | |----------------------|-----------------------------------|-----------------------------------------| | **配置文件前缀** | `spring.redis.*` | `spring.data.redis.*` | | **配置类注解前缀** | `@ConfigurationProperties("spring.redis")` | `@ConfigurationProperties("spring.data.redis")` | | **连接池配置路径** | `spring.redis.jedis.pool.*` | `spring.data.redis.jedis.pool.*` | | **自动配置类** | `RedisAutoConfiguration` | `RedisConnectionConfiguration` | --- ### 📝 配置类实现对比 #### 1. **Spring Boot 2.x 配置类示例** ```java @Configuration @EnableConfigurationProperties @ConfigurationProperties(prefix = "spring.redis") // 关键前缀 public class RedisConfig { private String host; private int port; private String password; private JedisPoolConfig poolConfig; // 连接池配置 // 创建JedisConnectionFactory @Bean public JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); config.setHostName(host); config.setPort(port); config.setPassword(RedisPassword.of(password)); JedisClientConfiguration.JedisPoolingClientConfigurationBuilder builder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder(); builder.poolConfig(poolConfig); // 注入连接池配置 return new JedisConnectionFactory(config, builder.build()); } } ``` > **说明**:通过 `@ConfigurationProperties(prefix = "spring.redis")` 绑定配置文件属性[^2]。 #### 2. **Spring Boot 3.x 配置类示例** ```java @Configuration @EnableConfigurationProperties @ConfigurationProperties(prefix = "spring.data.redis") // 新版前缀 public class RedisConfig { private String host; private int port; private String password; private JedisPoolConfig poolConfig; @Bean public JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); config.setHostName(host); config.setPort(port); config.setPassword(RedisPassword.of(password)); JedisClientConfiguration.JedisPoolingClientConfigurationBuilder builder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder(); builder.poolConfig(poolConfig); return new JedisConnectionFactory(config, builder.build()); } } ``` > **说明**:注解前缀必须改为 `spring.data.redis`,否则无法读取配置[^1][^2]。 --- ### ⚠ 关键注意事项 1. **版本兼容性** - 若从 3.x 降级到 2.x,需将所有配置文件中的 `spring.data.redis` 改为 `spring.redis` - 升级到 3.x 时,需更新配置类的前缀注解 2. **连接池配置绑定** Spring Boot 3.x 要求显式声明连接池配置类: ```yaml spring: data: redis: jedis: pool: max-active: 100 max-idle: 10 ``` 3. **自动配置机制差异** - 2.x 通过 `RedisAutoConfiguration` 加载配置[^3] - 3.x 改为 `RedisConnectionConfiguration`,需确保配置类被正确扫描 --- ### 💡 最佳实践建议 1. **使用 Profile 多环境配置** 在 `application.yml` 中区分环境: ```yaml # 2.x 单机配置 spring: profiles: single redis: host: 192.168.1.100 port: 6379 # 3.x 集群配置 spring: profiles: cluster data: redis: cluster: nodes: - 192.168.1.101:7001 - 192.168.1.102:7002 ``` 2. **兼容性处理技巧** 通过条件注解兼容多版本: ```java @Bean @ConditionalOnProperty(name = "spring.redis.host") // 2.x 条件 public ConnectionFactory redisFactoryV2() { ... } @Bean @ConditionalOnProperty(name = "spring.data.redis.host") // 3.x 条件 public ConnectionFactory redisFactoryV3() { ... } ``` --- ### ❓相关问题 1. Spring Boot 3.x 中如何通过配置类实现 Redis 集群连接? 2. 配置类中如何处理 Lettuce 和 Jedis 客户端的自动切换? 3. 如何验证配置类中的属性值是否正确绑定? 4.Spring Boot 2.x 升级到 3.x 时,如何批量修改 Redis 配置前缀? > 参考资料: > [^1]: Spring Boot 2.x 连接 Redis 配置要求 > [^2]: 单机版 Redis 配置示例 > [^3]: Spring Boot 自动配置机制解析
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值