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;
}