Springboot +Redis

36 阅读2分钟
  1. Springboot框架是Java语言的必学框架之一,框架Springboot,dependence的是NOSQL中的Spring data Redis(Redis+driver)
  2. Redis客户端连接池lettuce,那么它的pom.xml模本配置如下:
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</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-web</artifactId>
    </dependency>
    <dependency>
        <groupId>io.lettuce</groupId>
        <artifactId>lettuce-core</artifactId>
    </dependency>
</dependencies>
  1. 连接远程redis服务,application.properties模本配置
spring.application.name=根据你的文件名
spring.data.redis.database=0
spring.data.redis.port=6379
spring.data.redis.host="ip地址"
spring.data.redis.password="redis密码"
  • spring.data.redis.database和spring.data.redis.port这两个配置项是默认的,也可以自定义。
  1. 使用原生的RedisTemplate的配置类时,它不能将uncoide编码的数据项序列化,key项就是乱码形式展现,那么可以自己配置,RedisConfig.java如下:
// 第一种
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);

    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
    return template;
}
//第二种
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory)
    {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        StringRedisSerializer keySerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(keySerializer);
        redisTemplate.setHashKeySerializer(keySerializer);
        Jackson2JsonRedisSerializer<Object> valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        valueSerializer.setObjectMapper(mapper);
        redisTemplate.setValueSerializer(valueSerializer);
        redisTemplate.setHashValueSerializer(valueSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
  1. 消息订阅和消息发送,RedisConfig.java模本如下:
//第一种
@Bean
                      // 第一种 MessageListener messageListener
RedisMessageListenerContainer container(LettuceConnectionFactory redisConnectionFactory,MessageListener messageListener) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
             //设置连接工厂
    container.setConnectionFactory(redisConnectionFactory);
            // 设置监听者绑定的管道
    List<Topic> topicList = new ArrayList<>();
    topicList.add(new PatternTopic("log"));
    container.addMessageListener(messageListener, topicList);
    return container;
}

//第二种
   @Bean
                //第二种 MessageListenerAdapter messageListenerAdapter
RedisMessageListenerContainer container(LettuceConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    //设置连接工厂
    container.setConnectionFactory(redisConnectionFactory);
    // 设置监听者绑定的管道
    List<Topic> topicList = new ArrayList<>();
    topicList.add(new PatternTopic("log"));
    container.addMessageListener(messageListenerAdapter, topicList);
    return container;
}
// 消息倾听器,将消息委托给目标倾听器
@Bean
public MessageListenerAdapter listenerAdapter(MessageListener listener)
{
    return new  MessageListenerAdapter(listener);
}
  1. 订阅者subscriber接收发布者publish发布的消息,并将通过哪一条管道和管道消息体的消息项序列化,Subscriber.java的模本如下:
@Component
public class Subscriber implements MessageListener {
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    public void onMessage(Message message, byte[]pattern)
    {
        //封装消息管道和消息内容的
        //获取管道
        byte[] channel = message.getChannel();
        //消息体
        byte[] body = message.getBody();
        
        Object channelInfo = redisTemplate.getKeySerializer().deserialize(channel);

        Object bodyInfo = redisTemplate.getValueSerializer().deserialize(body);

        //todo 日志处理,邮件发送等操作
        System.out.println("管道:"+channelInfo+'-'+"消息内容:"+bodyInfo);
    }
}
  1. Demo3Application.java模本如下:
@SpringBootApplication
public class Demo3Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo3Application.class, args);
    }
}
  1. Demo3ApplicationTests.java模本如下:
@SpringBootTest
class Demo3ApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;
    
    @Test
    public void Test03()
    {
        ValueOperations timeOper = redisTemplate.opsForValue();
        timeOper.set("time","2025-11-30");
    }
}