SpringBoot配置redis以及设置监听

spring-boot配置redis

一、增加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

二、增加配置

  redis:
    host: 127.0.0.1
    port: 6379
    timeout: 3000

三、增加配置文件

package com.strap.mydemo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import lombok.extern.log4j.Log4j;
import org.springframework.cache.Cache;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * <p>消息监听配置</p>
 *
 * @author strap
 */
@Configuration
@Log4j
public class RedisConfig {

    public RedisConfig() {
    }

    @Bean
    public RedisTemplate<String, Object> initTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer<Object> valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        valueSerializer.setObjectMapper(objectMapper);

        StringRedisSerializer keySerializer = new StringRedisSerializer();

        // key均采用string的序列化方式
        redisTemplate.setKeySerializer(keySerializer);
        redisTemplate.setHashKeySerializer(keySerializer);

        // value均采用jackson序列化
        redisTemplate.setValueSerializer(valueSerializer);
        redisTemplate.setHashValueSerializer(valueSerializer);

        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * redis数据操作异常处理
     * 这里的处理:在日志中打印出错误信息,但是放行
     * 保证redis服务器出现连接等问题的时候不影响程序的正常运行,使得能够出问题时不用缓存
     */
    @Bean
    public CacheErrorHandler errorHandler() {
        return new CacheErrorHandler() {
            @Override
            public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {
                log.error("redis异常:key=[{" + key + "}]", e);
            }

            @Override
            public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {
                log.error("redis异常:key=[{" + key + "}]", e);
            }

            @Override
            public void handleCacheEvictError(RuntimeException e, Cache cache, Object key) {
                log.error("redis异常:key=[{" + key + "}]", e);
            }

            @Override
            public void handleCacheClearError(RuntimeException e, Cache cache) {
                log.error("redis异常:", e);
            }
        };
    }

}

四、Redis配置监听

1、开启监听

在这里插入图片描述

修改其中的配置,打开监听

notify-keyspace-events "" 修改为 notify-keyspace-events "Ex"

重启redis服务

命令详解

在这里插入图片描述

开启键空间通知功能需要消耗一些CPU,所以在默认配置下,该功能处于关闭状态。
notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知

📌

  1. K :键空间通知,所有通知以_keyspace@为前缀
  2. E: 键事件通知,所有通知以_keyevent@为前缀
  3. g: DEL 、 EXPIRE 、RENAME 等类型无关的通用命令的通知
  4. $:字符串命令的通知
  5. l:列表命令的通知
  6. s:集合命令的通知
  7. h:哈希命令的通知
  8. z:有序集合命令的通知
  9. x:过期事件,每当有过期键被删除时发送
  10. d:驱逐(evict)事件:每当有键因为maxmemory政策而被删除时发送
  11. A:参数g$lshzxe的别名

输入的参数中至少要有一个K或者E,否则的话,不管其余的参数是什么,都不会有任何通知被分发

2、测试

  1. 配置结束后重启redis,执行redis-start.bat
  2. 运行客户端redis-start.bat,选择你需要监听的库,即@后面的值,redis默认配置连接的是0号库,运行命令psubscribe __keyevent@0__:expired
  3. 再启动一个客户端,设置一个3秒过期的key,执行命令SETEX mykey 3 redis
  4. 观察第一个客户端,是否成功输出以下通知,即通知开启成功

在这里插入图片描述

3、SpringBoot配置类添加监听容器初始化代码

   /**
     * 配置监听
     */
    @Bean
    public RedisMessageListenerContainer messageListenerContainer(RedisConnectionFactory redisConnectionFactory) throws Exception {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        return container;
    }

4、增加监听器

package com.strap.mydemo.components;

import lombok.extern.log4j.Log4j;
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;

/**
 * <p></p>
 *
 * @author strap
 */
@Log4j
@Component
public class KeyExpiredListener extends KeyExpirationEventMessageListener {

    public KeyExpiredListener(RedisMessageListenerContainer container) {
        super(container);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("这是被销毁的Key:" + message.toString());
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用Spring Data Redis监听Redis中的键过期事件。具体操作如下: 1. 添加依赖 在pom.xml文件中添加spring-boot-starter-data-redisspring-boot-starter-web依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 配置RedisTemplate 在application.properties或application.yml文件中配置Redis连接信息和RedisTemplate: ```yaml spring: redis: host: localhost port: 6379 database: 0 password: 123456 timeout: 10000 cache: type: redis ``` ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` 3. 配置消息监听器 创建一个Redis过期事件监听器,实现MessageListener接口,重写onMessage方法: ```java @Component public class RedisKeyExpirationListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String expiredKey = message.toString(); // 在这里实现过期时的处理逻辑 System.out.println("Key expired: " + expiredKey); } } ``` 4. 配置监听器容器 在配置类中创建一个RedisMessageListenerContainer对象,设置RedisConnectionFactory、MessageListenerAdapter和监听的Pattern: ```java @Configuration public class RedisConfig { @Autowired private RedisKeyExpirationListener redisKeyExpirationListener; @Bean public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(factory); container.addMessageListener(new MessageListenerAdapter(redisKeyExpirationListener), new PatternTopic("__keyevent@0__:expired")); return container; } } ``` 以上就是配置Redis过期监听的步骤,监听器容器启动后,就可以监听Redis中键的过期事件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值