这篇文章主要讲解了“SpringBoot2.4.2下怎么使用Redis配置Lettuce”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot2.4.2下怎么使用Redis配置Lettuce”吧!
1. Springboot2.4.2下对Redis的基础集成
1.1 maven添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.4.2</version> </dependency>
注:Springboot2.4.2下默认使用的就是Lettuce而不是Jedis因此无需在依赖进行排除Jedis
1.2 添加Redis配置文件
首先Redis需要准备一个配置文件,本文设定一个单独的文件redis.properties 放在resource文件夹下
redis.properties
hostName = localhost port = 6379 password = password pool.maxIdle = 10000 pool.minIdle = 1000 pool.maxWaitMillis = 5000 pool.maxTotal = 2 database = 10
1.3 注册RedisTemplate和StringRedisTemplate的Bean
LettuceRedisConfig.java
package com.xxx.demo.redis;import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.data.redis.connection.RedisStandaloneConfiguration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.io.Serializable;import java.time.Duration;@Configuration@PropertySource("classpath:redis.properties")public class LettuceRedisConfig { @Value("${hostName}") private String hostName; @Value("${password}") private String password; @Value("${port}") private int port; @Value("${database}") private int database; @Value("${pool.maxIdle}") private int maxIdle; @Value("${pool.minIdle}") private int minIdle; @Value("${pool.maxWaitMillis}") private int maxWaitMillis; @Value("${pool.maxTotal}") private int maxTotal; @Bean public LettuceConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration (); redisStandaloneConfiguration.setHostName (hostName); redisStandaloneConfiguration.setPort (port); redisStandaloneConfiguration.setPassword (password); redisStandaloneConfiguration.setDatabase (database); GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig (); poolConfig.setMaxIdle (maxIdle); poolConfig.setMinIdle (minIdle); poolConfig.setMaxWaitMillis (maxWaitMillis); poolConfig.setMaxTotal (maxTotal); LettucePoolingClientConfiguration lettucePoolingClientConfiguration = LettucePoolingClientConfiguration.builder ().commandTimeout (Duration.ofSeconds (10)).shutdownTimeout (Duration.ZERO).poolConfig (poolConfig).build (); LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory (redisStandaloneConfiguration, lettucePoolingClientConfiguration); lettuceConnectionFactory.setShareNativeConnection (false); return lettuceConnectionFactory; } @Bean public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) { RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<> (); redisTemplate.setKeySerializer (new StringRedisSerializer ()); redisTemplate.setValueSerializer (new GenericJackson2JsonRedisSerializer ()); redisTemplate.setConnectionFactory (connectionFactory); return redisTemplate; } @Bean public StringRedisTemplate configStringRedisTemplate(@Autowired LettuceConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate (factory); template.setEnableTransactionSupport (true); ObjectMapper mapper; GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer (); template.setValueSerializer (new StringRedisSerializer ()); template.setKeySerializer (new StringRedisSerializer ()); template.setHashKeySerializer (new StringRedisSerializer ()); template.setHashValueSerializer (new StringRedisSerializer ()); template.afterPropertiesSet (); return template; }}
1.4 编写一个控制器示例进行redis操作
package com.xx.demo.controller;import com.xxx.demo.redis.MessagePublisher;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("redis")public class RedisController { final StringRedisTemplate redisTemplate; public RedisController(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @GetMapping("add") public String add() { redisTemplate.opsForValue ().set ("a", "1"); return "hi"; }}
2. 使用redis进行发布订阅
2.1 添加一个发布者的接口
package com.xxx.demo.redis;public interface MessagePublisher { void publish(final String message);}
2.2 添加一个发布者的实现类
RedisMessagePublisher.java
package com.xxx.demo.redis;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.listener.ChannelTopic;import java.io.Serializable;public class RedisMessagePublisher implements MessagePublisher { @Autowired private RedisTemplate<String, Serializable> redisTemplate; @Autowired private ChannelTopic topic; public RedisMessagePublisher() { } public RedisMessagePublisher(final RedisTemplate<String, Serializable> redisTemplate, final ChannelTopic topic) { this.redisTemplate = redisTemplate; this.topic = topic; } @Override public void publish(final String message) { redisTemplate.convertAndSend (topic.getTopic (), message); }}
2.3 添加一个消息监听bean
RedisMessageSubscriber.java
package com.xxx.demo.redis;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;import org.springframework.scheduling.annotation.Async;public class RedisMessageSubscriber implements MessageListener { @Override @Async public void onMessage(Message message, byte[] pattern) { System.out.println ("Message received: " + new String (message.getBody ())); }}
2.4 添加bean注册
RedisMessageConfig.java
package com.xxx.demo.redis;import org.springframework.beans.factory.annotation.Autowired;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.listener.ChannelTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;import java.io.Serializable;@Configurationpublic class RedisMessageConfig { @Bean MessageListenerAdapter messageListener() { return new MessageListenerAdapter (new RedisMessageSubscriber ()); } @Bean RedisMessageListenerContainer redisContainer(LettuceConnectionFactory factory) { final RedisMessageListenerContainer container = new RedisMessageListenerContainer (); container.setConnectionFactory (factory); container.addMessageListener (messageListener (), topic ()); return container; } @Bean MessagePublisher redisPublisher(@Autowired RedisTemplate<String, Serializable> redisTemplate) { return new RedisMessagePublisher (redisTemplate, topic ()); } @Bean ChannelTopic topic() { return new ChannelTopic ("pubsub:queue"); }}
2.5 改写之前的控制器如下
package com.xxx.demo.controller;import com.kreakin.demo.redis.MessagePublisher;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("redis")public class RedisController { final StringRedisTemplate redisTemplate; final MessagePublisher publisher; public RedisController(StringRedisTemplate redisTemplate, MessagePublisher publisher) { this.redisTemplate = redisTemplate; this.publisher = publisher; } @GetMapping("hi") public String hi() { redisTemplate.opsForValue ().set ("a", "1"); return "hi"; } @GetMapping("pub") public String pub() { publisher.publish ("sdfsf"); return "ok"; }}
3. 监听key的过期事件
RedisKeyExpireSubscriber.java
package com.xxx.demo.redis;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.stereotype.Component;@Slf4j@Componentpublic class RedisKeyExpireSubscriber extends KeyExpirationEventMessageListener { public RedisKeyExpireSubscriber(RedisMessageListenerContainer listenerContainer) { super (listenerContainer); } @Override public void onMessage(Message message, byte[] pattern) { log.error (message.toString ()); }}
注意: Redis需要开启事件
感谢各位的阅读,以上就是“SpringBoot2.4.2下怎么使用Redis配置Lettuce”的内容了,经过本文的学习后,相信大家对SpringBoot2.4.2下怎么使用Redis配置Lettuce这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!