redis lettuce 超时_Spring Boot 2.X(六):Spring Boot 集成 Redis

本文介绍如何使用SpringBoot 2.X通过Lettuce和Jedis两种客户端集成Redis服务,并演示了如何自定义RedisTemplate来操作实体对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ea5dc42b-9da7-4dba-8f4a-ddb629f95501

Redis 简介

什么是 Redis

Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库。

Redis 与其他 key-value 缓存(如 Memcached )相比有以下三个特点:

1.Redis 支持数据的持久化,它可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。2.Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。

3.Redis 支持数据的备份,即 master-slave 模式的数据备份。

Redis 优势如下:

1.性能极高。Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。

2.丰富的数据类型。Redis 支持二进制案例的 Strings,Lists,Sets 及 Ordered Sets 数据类型操作。3.原子性。Redis 所有的操作都是原子性的,意思是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作也是,通过 MULTI 和 EXEC 指令抱起来。4.丰富的特性。Redis 还支持 publish/subscribe,通知,key 过期等特性。

Spring Boot 集成 Redis

1.在项目中添加依赖

<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.boot        spring-boot-starter-parent        2.1.9.RELEASEcn.zwqh    spring-boot-redis    0.0.1-SNAPSHOTspring-boot-redisspring-boot-redis1.8org.springframework.boot            spring-boot-starter-web        org.springframework.boot            spring-boot-starter-test            testorg.springframework.boot            spring-boot-starter-data-redis        org.springframework.boot                spring-boot-maven-plugin            

查看 jar 包时发现,Spring Data Redis 下 org.springframework.data.redis.connection 包路径下面默认有两个包 jedis 和 lettuce,这说明 Spring Boot 已经默认包装适配了这两个 Redis 客户端。

在 springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的,springboot 2.x版本中默认客户端是用 lettuce实现的。

Lettuce 与 Jedis 比较

Lettuce 和 Jedis 的都是连接 Redis Server的客户端。

Jedis 在实现上是直连 redis server,多线程环境下非线程安全,除非使用连接池,为每个 redis实例增加物理连接。


Lettuce 是 一种可伸缩,线程安全,完全非阻塞的Redis客户端,多个线程可以共享一个RedisConnection,它利用Netty NIO 框架来高效地管理多个连接,从而提供了异步和同步数据访问方式,用于构建非阻塞的反应性应用程序。


下面我们分别使用 Lettuce 和 Jedis 来集成 Redis 服务

2. Lettuce 集成 Redis 服务

导入依赖

由于 Spring Boot 2.X 默认集成了 Lettuce ,所以无需导入。

application.properties配置文件

################ Redis 基础配置 ############### Redis数据库索引(默认为0)spring.redis.database=0  # Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379  # Redis服务器连接密码(默认为空)spring.redis.password=zwqh# 链接超时时间 单位 ms(毫秒)spring.redis.timeout=3000################ Redis 线程池设置 ############### 连接池最大连接数(使用负值表示没有限制) 默认 8spring.redis.lettuce.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1spring.redis.lettuce.pool.max-wait=-1# 连接池中的最大空闲连接 默认 8spring.redis.lettuce.pool.max-idle=8# 连接池中的最小空闲连接 默认 0spring.redis.lettuce.pool.min-idle=0

自定义 RedisTemplate

默认情况下的模板只能支持 RedisTemplate,只能存入字符串,很多时候,我们需要自定义 RedisTemplate ,设置序列化器,这样我们可以很方便的操作实例对象。如下所示:

@Configurationpublic class LettuceRedisConfig {    @Bean    public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) {        RedisTemplate redisTemplate = new RedisTemplate<>();        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setConnectionFactory(connectionFactory);        return redisTemplate;    }}

序列化实体类

public class UserEntity implements Serializable {    /**     *      */    private static final long serialVersionUID = 5237730257103305078L;        private Long id;    private String userName;    private String userSex;    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getUserSex() {        return userSex;    }    public void setUserSex(String userSex) {        this.userSex = userSex;    }    }

单元测试

@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringBootRedisApplicationTests {    @Autowired    private RedisTemplate strRedisTemplate;    @Autowired    private RedisTemplate serializableRedisTemplate;        @Test    public void testString() {        strRedisTemplate.opsForValue().set("strKey", "zwqh");        System.out.println(strRedisTemplate.opsForValue().get("strKey"));    }        @Test    public void testSerializable() {        UserEntity user=new UserEntity();        user.setId(1L);        user.setUserName("朝雾轻寒");        user.setUserSex("男");                serializableRedisTemplate.opsForValue().set("user", user);                UserEntity user2 = (UserEntity) serializableRedisTemplate.opsForValue().get("user");        System.out.println("user:"+user2.getId()+","+user2.getUserName()+","+user2.getUserSex());    }}

执行结果如下:

fba7873f357c41198fa1e7fb5bbf9119

得到我们预期的结果。

3.Jedis 集成 Redis 服务

pom 文件

<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.boot        spring-boot-starter-parent        2.1.9.RELEASEcn.zwqh    spring-boot-redis    0.0.1-SNAPSHOTspring-boot-redisspring-boot-redis1.8org.springframework.boot            spring-boot-starter-web        org.springframework.boot            spring-boot-starter-test            testorg.springframework.boot            spring-boot-starter-data-redis            io.lettuce                    lettuce-core                redis.clients            jedis        org.springframework.boot                spring-boot-maven-plugin            

application.properties配置文件

################ Redis 基础配置 ############### Redis数据库索引(默认为0)spring.redis.database=0  # Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379  # Redis服务器连接密码(默认为空)spring.redis.password=zwqh# 链接超时时间 单位 ms(毫秒)spring.redis.timeout=3000################ Redis 线程池设置 ############### 连接池最大连接数(使用负值表示没有限制) 默认 8spring.redis.jedis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1spring.redis.jedis.pool.max-wait=-1# 连接池中的最大空闲连接 默认 8spring.redis.jedis.pool.max-idle=8# 连接池中的最小空闲连接 默认 0spring.redis.jedis.pool.min-idle=0

JedisRedisConfig

@Configurationpublic class JedisRedisConfig {    @Value("${spring.redis.database}")    private int database;    @Value("${spring.redis.host}")    private String host;    @Value("${spring.redis.port}")    private int port;    @Value("${spring.redis.password}")    private String password;    @Value("${spring.redis.timeout}")    private int timeout;    @Value("${spring.redis.jedis.pool.max-active}")    private int maxActive;    @Value("${spring.redis.jedis.pool.max-wait}")    private long maxWaitMillis;    @Value("${spring.redis.jedis.pool.max-idle}")    private int maxIdle;    @Value("${spring.redis.jedis.pool.min-idle}")    private int minIdle;    /**     * 连接池配置信息     */    @Bean    public JedisPoolConfig jedisPoolConfig() {        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();        // 最大连接数        jedisPoolConfig.setMaxTotal(maxActive);        // 当池内没有可用连接时,最大等待时间        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);        // 最大空闲连接数        jedisPoolConfig.setMinIdle(maxIdle);        // 最小空闲连接数        jedisPoolConfig.setMinIdle(minIdle);        // 其他属性可以自行添加        return jedisPoolConfig;    }    /**     * Jedis 连接     *      * @param jedisPoolConfig     * @return     */    @Bean    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {        JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling()                .poolConfig(jedisPoolConfig).and().readTimeout(Duration.ofMillis(timeout)).build();        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();        redisStandaloneConfiguration.setHostName(host);        redisStandaloneConfiguration.setPort(port);        redisStandaloneConfiguration.setPassword(RedisPassword.of(password));        return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);    }    /**     * 缓存管理器     *      * @param connectionFactory     * @return     */    @Bean    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {        return RedisCacheManager.create(connectionFactory);    }    @Bean    public RedisTemplate redisTemplate(JedisConnectionFactory connectionFactory) {        RedisTemplate redisTemplate = new RedisTemplate<>();        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));        return redisTemplate;    }}

单元测试同上

出现预期结果。

总结

上面介绍了 Spring Boot 2.X 如何通过 Lettuce 和 Jedis 来集成 Redis 服务,按项目需求,我们也可以自定义操作类来实现数据操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值