SpringBoot 監(jiān)聽Redis鍵過(guò)期事件(過(guò)期監(jiān)聽)
介紹
Redis 鍵過(guò)期事件是 Redis 中非常有用的功能,可以在鍵過(guò)期時(shí)觸發(fā)事件通知。這對(duì)于緩存失效、會(huì)話管理、定時(shí)任務(wù)等場(chǎng)景非常有用。
Redis配置
Redis 默認(rèn)是沒(méi)有啟用鍵過(guò)期事件通知的,你需要通過(guò)配置來(lái)啟用這個(gè)功能。可以通過(guò)修改 redis.conf 文件或者使用 CONFIG SET 命令來(lái)啟用鍵過(guò)期事件通知。
notify-keyspace-events Ex
依賴
<!-- 操作redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
spring:
redis:
host: localhost
port: 6379
#password: 用的本機(jī)的redis,并且我沒(méi)有設(shè)置redis密碼
database: 0
lettuce:
pool:
# 最大阻塞等待時(shí)間,負(fù)數(shù)表示沒(méi)有限制
max-wait: -1
# 連接池中的最大空閑連接
max-idle: 5
# 連接池中的最小空閑連接
min-idle: 0
# 連接池中最大連接數(shù),負(fù)數(shù)表示沒(méi)有限制
寫入鍵
@RestController
@RequiredArgsConstructor
public class BasicController {
private final StringRedisTemplate stringRedisTemplate;
@GetMapping("/hello")
public String hello() {
// 設(shè)置鍵值對(duì),并指定過(guò)期時(shí)間為 10 秒
stringRedisTemplate.opsForValue().set("product:123", "dpc", Duration.ofSeconds(5));
// 獲取值
String str = stringRedisTemplate.opsForValue().get("name");
System.out.println("Value: " + str);
return str;
}
}
配置監(jiān)聽器
@Configuration
public class RedisListenerConfig {
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
@Bean
public OrderKeyExpirationListener orderKeyExpirationListener(RedisMessageListenerContainer container) {
// 配置監(jiān)聽器只監(jiān)聽 `order:*` 鍵
OrderKeyExpirationListener listener = new OrderKeyExpirationListener(container);
container.addMessageListener(listener, new ChannelTopic("__keyevent@0__:expired"));
return listener;
}
@Bean
public SessionKeyExpirationListener sessionKeyExpirationListener(RedisMessageListenerContainer container) {
// 配置監(jiān)聽器只監(jiān)聽 `session:*` 鍵
SessionKeyExpirationListener listener = new SessionKeyExpirationListener(container);
container.addMessageListener(listener, new ChannelTopic("__keyevent@0__:expired"));
return listener;
}
@Bean
public ProductKeyExpirationListener productKeyExpirationListener(RedisMessageListenerContainer container) {
// 配置監(jiān)聽器只監(jiān)聽 `product:*` 鍵
ProductKeyExpirationListener listener = new ProductKeyExpirationListener(container);
container.addMessageListener(listener, new ChannelTopic("__keyevent@0__:expired"));
return listener;
}
}
按KEY監(jiān)聽
監(jiān)聽session鍵
@Slf4j
public class SessionKeyExpirationListener extends KeyExpirationEventMessageListener {
public SessionKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String key = message.toString();
if (key.startsWith("session:")) {
log.info("會(huì)話【" + key + "】已過(guò)期");
// 處理會(huì)話超時(shí)的邏輯
}
}
}
監(jiān)聽product鍵
@Slf4j
public class ProductKeyExpirationListener extends KeyExpirationEventMessageListener {
public ProductKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String key = message.toString();
if (key.startsWith("product:")) {
log.info("產(chǎn)品【" + key + "】已過(guò)期");
// 處理產(chǎn)品相關(guān)的超時(shí)邏輯
}
}
}
監(jiān)聽order鍵
public class OrderKeyExpirationListener extends KeyExpirationEventMessageListener {
public OrderKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String key = message.toString();
System.out.println(123);
if (key.startsWith("order:")) {
// 處理訂單相關(guān)的超時(shí)邏輯
}
}
}到此這篇關(guān)于SpringBoot 監(jiān)聽Redis鍵過(guò)期事件(過(guò)期監(jiān)聽)的文章就介紹到這了,更多相關(guān)SpringBoot 監(jiān)聽Redis過(guò)期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)矩陣運(yùn)算案例詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)矩陣運(yùn)算案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例
本文主要介紹了MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Springboot如何獲取上下文ApplicationContext
這篇文章主要介紹了Springboot如何獲取上下文ApplicationContext,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息解決
這篇文章主要為大家介紹了RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息原因及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn),結(jié)合了mybatis-plus的插件方式,做出了自己的注解方式的數(shù)據(jù)權(quán)限,雖然可能存在一部分的局限性,但很好的解決了我們自己去解析SQL的功能,需要的朋友可以參考下2023-06-06
Java如何實(shí)現(xiàn)調(diào)用外部Api
這篇文章主要介紹了Java如何實(shí)現(xiàn)調(diào)用外部Api問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
基于JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例
這篇文章主要介紹了JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

