redis動態指定切換庫和監聽key失效

redis動態指定切換庫的方式很多,比如註解+AOP,本方法是比較簡單的一種,沒有使用註解

1 、redisConfig

package com.oceam.redis;


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * redis配置類
 *
 */
@Configuration
public class RedisConfig {

    @Bean("redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 將剛纔的redis連接工廠設置到模板類中
        template.setConnectionFactory(redisConnectionFactory);
        // 設置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        // 設置value的序列化器
        //使用Jackson 2,將對象序列化爲JSONJackson2JsonRedisSerializer
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        //json轉對象類,不設置默認的會將json轉成hashmap
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
//        監聽所有的庫
        container.setConnectionFactory(connectionFactory);
        //下面這種方式是靈活配置,針對每個庫(0-14)的失效key做處理
        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@5__:expired"));
        return container;
    }
}

2、指定庫監聽類

package com.oceam.redis;

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;

/**
 * 指定redis庫的key失效時候監聽類
 * CDN
 * 2020/05/02 16:38
 */
public class RedisExpiredListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] bytes) {
        byte[] body = message.getBody();
        System.out.println(new String(body));
    }
}

3、全局監聽

package com.oceam.redis;

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;

/**
 * 不指定redis數據庫(全局監聽)
 * CDN
 * 2020/05/02 16:10
 */
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 針對 redis 數據失效事件,進行數據處理
     *
     * @param message
     * @param pattern
     */

    @Override
    public void onMessage(Message message, byte[] pattern) {
// 獲取到失效的 key,進行取消訂單業務處理
        String expiredKey = message.toString();
        System.out.println(expiredKey+"失效了");
    }
}

到此爲止,去哪聚監聽redis的key失效和指定庫監聽redis的key失效已將完成

 

(二) 指定存庫

redis有15個庫,默認是存在第一個,即小標是0 的庫

 /**
     * 指定庫操作
     *
     * @param key     鍵
     * @param value   值
     * @param time    時間(秒) time要大於0 如果time小於等於0 將設置無限期
     * @param dbIndex 要存的庫位置
     * @return true成功 false 失敗
     */
    public boolean setValueToDataBase(String key, Object value, long time, Integer dbIndex) {
        try {
            LettuceConnectionFactory redisConnectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
            if (dbIndex > 0) {
                redisConnectionFactory.setDatabase(dbIndex);
                redisTemplate.setConnectionFactory(redisConnectionFactory);
                redisConnectionFactory.resetConnection();
            }
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            } else {
                redisTemplate.opsForValue().set(key, value);
            }
            //重置爲默認的第0個庫
            redisConnectionFactory.setDatabase(0);
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisConnectionFactory.resetConnection();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * desc:   獲取指定庫中的指定key的value
     * param:
     * @dbIndex   數據庫
     * author: CDN
     * date: 2020/5/2
     */
    public Object getValueFromRedisDatabase(String key, Integer dbIndex) {
        LettuceConnectionFactory redisConnectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
        redisConnectionFactory.setDatabase(dbIndex);
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisConnectionFactory.resetConnection();
        Object o = redisTemplate.opsForValue().get(key);

        //重置爲默認的第0個庫
        redisConnectionFactory.setDatabase(0);
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisConnectionFactory.resetConnection();
        return o;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章