SpringBoot配置redis以及设置监听

spring-boot配置redis

一、增加依赖

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        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;

/**
 * 

消息监听配置

* * @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、开启监听

SpringBoot配置redis以及设置监听_第1张图片

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

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

重启redis服务

命令详解

SpringBoot配置redis以及设置监听_第2张图片

开启键空间通知功能需要消耗一些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. 观察第一个客户端,是否成功输出以下通知,即通知开启成功

SpringBoot配置redis以及设置监听_第3张图片

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;

/**
 * 

* * @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()); } }

你可能感兴趣的:(Redis,spring,boot,redis,java)