在實際的開發專案中,監聽 key 的過期事件,應用非常廣泛,例如:訂單超時未支付,優惠券過期等等
一、說明
本篇文章是繼:
【SpringBoot】三十四、SpringBoot整合Redis實作序列化存盤Java物件
其中涉及到的知識及代碼,本篇文章不再進行贅述
二、修改 Redis 組態檔
- 1、在 Redis 的安裝目錄

- 2、找到 redis.windows.conf 檔案,搜索 “notify-keyspace-events”

修改為 “notify-keyspace-events Ex”,這樣我們的 Redis 就支持 key 過期事件的監聽了
三、注入redisMessageListenerContainer
注意:本偏文章銜接與上篇文章:【SpringBoot】三十四、SpringBoot整合Redis實作序列化存盤Java物件,其中的配置資訊本篇文章不在贅述
- 1、還是在 RedisConfig.java 中注入一個 redisMessageListenerContainer 的Bean 用于監聽
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// 監聽所有庫的key過期事件
container.setConnectionFactory(connectionFactory);
return container;
}
- 2、創建監聽類RedisKeyExpirationListener
我們需要創建監聽 key 過期類,來實作當事件觸發時的具體操作
package com.zyxx.common.redis;
import lombok.extern.slf4j.Slf4j;
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 key 過期事件
*
* @Author Lizhou
*/
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {
super(redisMessageListenerContainer);
}
/**
* 針對 redis 資料失效事件,進行資料處理
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 拿到key
log.info("監聽Redis key過期,key:{},channel:{}", message.toString(), new String(pattern));
}
}
我們可以監聽到過期的 key 的資訊,以及通道的資訊
- 3、操作 API
在 RedisUtils 中加入如下操作
```java
/**
* 寫入資料,并設定過期時間
*/
public boolean set(final String key, Object value, long time) {
if (StringUtils.isBlank(key)) {
return false;
}
try {
template.opsForValue().set(key, value, time, TimeUnit.SECONDS);
log.info("存入redis成功,key:{},value:{}", key, value);
return true;
} catch (Exception e) {
log.error("存入redis失敗,key:{},value:{}", key, value);
e.printStackTrace();
}
return false;
}
借助此方法,我們可以向 Redis 中存入資料,并設定過期時間,單位為:秒(S)
``
四、測驗
- 1、測驗用例
package com.zyxx.redistest;
import com.zyxx.redistest.common.RedisUtils;
import com.zyxx.redistest.common.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
class RedisTestApplicationTests {
@Autowired
private RedisUtils redisUtil;
@Test
void contextLoads() {
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setName("jack");
userInfo.setCreateTime(new Date());
// 放入redis,并設定過期時間為5秒
redisUtil.set("user", userInfo, 5);
}
}
我們向 Redis 中存入了一個 key 為 “user”,value 為 UserInfo 物件的資料,并設定了過期時間為 5 秒
注意:在測驗之前,我們需要啟動我們的專案,才能將 Bean 注入到我們的容器中,監聽事件才會生效
- 2、測驗結果

可以看出我們的資料存入 Redis 成功
5秒后…

觸發了 key 過期事件,這時候,我們拿到過期的 key 就可以對應的做一些業務處理了
如您在閱讀中發現不足,歡迎留言!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189917.html
標籤:其他
