SpringBoot项目Redis两种实现Lettuce和Jedis比较

本文介绍如何在Spring Boot项目中集成Jedis和Lettuce两种Redis客户端,对比它们的线程安全性和连接池管理方式,提供详细的配置步骤和代码示例。

Jedis是直连模式,在多个线程间共享一个Jedis实例时是线程不安全的,可以通过创建多个Jedis实例来解决,但当连接数量增多时,物理连接成本就较高同时会影响性能,因此较好的解决方法是使用JedisPool。

Lettuce的连接是基于Netty的,连接实例可以在多个线程间共享,Netty可以使多线程的应用使用同一个连接实例,而不用担心并发线程的数量。通过异步的方式可以让我们更好地利用系统资源。

1、Jedis集成使用

1.1、pom.xml中添加redis相关依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.3</version>
</dependency>

1.2、redis配置文件

spring.redis.port=6377
spring.redis.timeout=20000
spring.redis.host=127.0.0.1
spring.redis.password=123456
# Redis数据库索引(默认为0)
spring.redis.database=1
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=3000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=200
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=10000

1.3、RedisConfig配置及注入

@Configuration
@PropertySource("classpath:/redis/redis.properties")
public class RedisConfig {
    @Bean
    public JedisPool redisPoolFactory()  throws Exception{
        logger.info("JedisPool注入成功!!");
        logger.info("redis地址:" + host + ":" + port);
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
        jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
        // 是否启用pool的jmx管理功能, 默认true
        jedisPoolConfig.setJmxEnabled(true);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password, database);
        return jedisPool;
    }
}

2、Lettuce集成使用

2.1、pom.xml中添加lettuce相关依赖

<!-- Redis Lettuce实现 -->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <!-- <version>2.1.3.RELEASE</version>-->
</dependency>
<!-- lettuce pool连接池 -->
<dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
</dependency>


2.2、lettuce配置文件

spring.redis.host=127.0.0.1
spring.redis.port=6377
# 密码 没有则可以不填
spring.redis.password=123456
spring.redis.database=1
spring.redis.timeout=20000
# 如果使用的jedis 则将lettuce改成jedis即可
# 最大活跃链接数
spring.redis.lettuce.pool.max-active=3000
spring.redis.lettuce.pool.max-wait=10000
# 最大空闲连接数
spring.redis.lettuce.pool.max-idle=200
# 最小空闲连接数
spring.redis.lettuce.pool.min-idle=0

2.3、RedisConfig配置及注入

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
    /**
     * 配置自定义redisTemplate
     * @return
     */
    @Bean
    RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(redisConnectionFactory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }

}

 

<think>好的,我现在需要回答用户关于Spring Boot中LettuceJedis的区别以及哪个更好的问题。首先,我得回忆一下这两个客户端库的基本信息。记得Jedis是一个比较老的Redis客户端,而Lettuce是后来出现的,支持异步响应式编程。不过具体细节可能记不太清楚,需要仔细核对。 首先,我应该比较两者的连接方式。Jedis是基于直连的,每个线程一个连接,这可能在高并发时导致资源不足。而Lettuce使用Netty作为通信层,支持连接池,能够更高效地管理连接,尤其是在并发环境下。这点需要确认是否正确,比如Lettuce是否默认使用连接池,或者是否需要配置。 然后,线程安全方面。用户提到的Jedis实例不是线程安全的,所以需要连接池来管理,而Lettuce的连接是线程安全的,可以在多个线程间共享。这里需要确认Lettuce的线程安全机制,是否确实不需要额外配置,或者是否存在特殊情况需要处理。 接下来是协议支持。用户可能关心是否支持Redis的集群、哨兵等模式。我记得LettuceRedis的高级功能支持更好,比如支持响应式编程,而Jedis可能在这些方面更新较慢。需要确认两者在Spring Boot中的集成情况,比如哪个版本开始支持某些特性。 性能方面,用户可能想知道在高并发下的表现。根据之前的了解,Lettuce因为基于Netty,异步非阻塞,可能在并发高时有更好的吞吐量,而Jedis在低并发时可能更快。需要查找相关基准测试的数据来支持这一点,或者参考官方文档的说法。 在Spring Boot中的自动配置,用户提到他们使用的版本可能影响客户端的选择。比如,Spring Boot 2.x默认使用Lettuce,而旧版本可能用Jedis。需要确认不同版本Spring Boot的默认配置,以及如何手动切换,比如排除Lettuce依赖,引入Jedis。 另外,用户提到他们项目用的是JDK 1.8,无法升级,所以可能受限于Spring Boot版本。需要说明在低版本Spring Boot中如何配置这两个客户端,可能涉及覆盖自动配置类,特别是关于认证的部分,比如用户名的问题,用户之前遇到了需要手动修改源码的情况,这可能与客户端的认证方式有关。 最后,总结两者的适用场景,帮助用户根据项目需求选择。比如,如果需要高并发异步支持,选择Lettuce;如果项目简单或需要低延迟,且不介意连接池管理,可以用Jedis。 在生成相关问题的时候,需要考虑用户可能的后续疑问,比如如何切换客户端、性能调优、特定功能实现等。这些问题应该与用户的实际应用场景相关,帮助他们进一步解决问题。 现在需要确保回答符合系统级指令:使用正确的中文,数学公式用$...$,独立公式用$$...$$,引用标识正确。不过这个问题中可能不涉及数学公式,所以可能不需要。但需要检查是否有需要的地方,比如性能指标如果有公式的话,但这里可能不需要。引用部分需要正确添加,用户提供的引用是关于旧版本Spring Boot连接Redis的问题,可能与认证相关,可以在回答中引用这一点,说明某些情况下需要手动配置。 另外,回答结构要清晰,分点比较,然后给出选择建议。确保信息准确,例如关于连接管理、线程安全、协议支持等方面,避免错误。可能还需要查阅Spring Boot官方文档或相关可靠资料来验证各个点,比如默认的客户端选择,配置方法等。 总结步骤: 1. 介绍LettuceJedis的基本区别。 2. 分点比较连接方式、线程安全、协议支持、性能、Spring Boot集成。 3. 根据用户的项目情况(JDK 1.8,Spring Boot版本)给出建议。 4. 引用用户提供的关于认证配置的问题,说明可能需要手动覆盖配置。 5. 生成相关问题,如切换方式、性能优化、认证配置等。</think>### LettuceJedis在Spring Boot中的区别及选择建议 在Spring Boot整合Redis时,LettuceJedis两种常用的客户端库。以下是两者的核心区别及适用场景分析: --- #### 1. **连接方式与线程安全** - **Jedis** - 基于直连模式,每个操作需要独立的TCP连接。 - 线程不安全,需通过连接池(如`JedisPool`)管理资源,避免多线程竞争[^1]。 - 示例配置: ```yaml spring: redis: host: localhost port: 6379 jedis: pool: max-active: 8 ``` - **Lettuce** - 基于Netty实现异步非阻塞I/O,支持连接复用。 - 线程安全,单个连接可跨线程共享,减少资源消耗。 - 默认支持响应式编程(Reactive API)。 --- #### 2. **协议与功能支持** - **Jedis** - 支持Redis基础命令及集群、哨兵模式,但高级功能(如响应式流)支持有限。 - 依赖同步通信,适用于简单场景。 - **Lettuce** - 全面支持Redis高级功能(如集群、哨兵、Pub/Sub、流处理)。 - 内置对异步操作响应式编程的支持(如`RedisTemplate`与`ReactiveRedisTemplate`)。 --- #### 3. **性能对比** - **低并发场景** Jedis因轻量级设计,延迟略低于Lettuce。 - **高并发场景** Lettuce的异步模型连接复用特性显著提升吞吐量,适合高并发或分布式系统[^1]。 --- #### 4. **Spring Boot集成** - **默认客户端** Spring Boot 2.x+ 默认集成Lettuce,如需切换为Jedis需手动排除依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> ``` - **认证问题** 低版本Spring Boot(如1.5.x)可能未适配Redis ACL用户名认证,需手动覆盖自动配置类。 --- #### 5. **选择建议** - **优先Lettuce的场景** - 高并发、异步需求 - 需要响应式编程支持 - 长期维护的项目(Spring Boot官方推荐) - **考虑Jedis的场景** - 旧项目受限于JDK版本(如JDK 1.8且无法升级Spring Boot) - 简单应用或对延迟极度敏感的场景 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值