【redis】spring boot利用redis的Keyspace Notifications實現訊息通知
阿新 • • 發佈:2019-06-27
前言
需求:當redis中的某個key失效的時候,更新key對應資料在資料庫的狀態
1、修改redis.conf
安裝的redis服務預設是: notify-keyspace-events "",修改成 notify-keyspace-events Ex;
位置:redis安裝目下的redis.windows-service.conf 或 redis.windows.conf。(具體看redis服務載入的哪個配置, 貌似要redis 2.8+才支援)
可以在redis.conf中找到對應的描述
# K 鍵空間通知,以__keyspace@<db>__為字首 # E 鍵事件通知,以__keysevent@<db>__為字首 # g del , expipre , rename 等型別無關的通用命令的通知, ... # $ String命令 # l List命令 # s Set命令 # h Hash命令 # z 有序集合命令 # x 過期事件(每次key過期時生成) # e 驅逐事件(當key在記憶體滿了被清除時生成) # A g$lshzxe的別名,因此”AKE”意味著所有的事件
2、配置服務端
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
RedisConfig.java
/** * redis監聽器 */ @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { log.info("***************************redis監聽器初始化***************************"); RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); /// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); return container; }
RedisKeyExpirationListener.java
/**
* 監聽所有db的過期事件__keyevent@*__:expired"
*
* @author lsm
*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
private static final Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 針對redis資料失效事件,進行資料處理
* redis.conf 設定 notify-keyspace-events "Ex"
*
* @param message
* @param pattern
*/
@Override
public synchronized void onMessage(Message message, byte[] pattern) {
// 使用者做自己的業務處理即可,注意message.toString()可以獲取失效的key
String expiredKey = message.toString();
log.info("redis失效key通知:expiredKey={}", expiredKey);
//如果xxx:開頭的key,進行處理
if (expiredKey.startsWith("orderId")) {
}
}
}