SpringBoot 監(jiān)聽(tīng)Redis鍵過(guò)期事件(過(guò)期監(jiān)聽(tīng))
介紹
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)有限制
寫(xiě)入鍵
@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)聽(tīng)器
@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)聽(tīng)器只監(jiān)聽(tīng) `order:*` 鍵 OrderKeyExpirationListener listener = new OrderKeyExpirationListener(container); container.addMessageListener(listener, new ChannelTopic("__keyevent@0__:expired")); return listener; } @Bean public SessionKeyExpirationListener sessionKeyExpirationListener(RedisMessageListenerContainer container) { // 配置監(jiān)聽(tīng)器只監(jiān)聽(tīng) `session:*` 鍵 SessionKeyExpirationListener listener = new SessionKeyExpirationListener(container); container.addMessageListener(listener, new ChannelTopic("__keyevent@0__:expired")); return listener; } @Bean public ProductKeyExpirationListener productKeyExpirationListener(RedisMessageListenerContainer container) { // 配置監(jiān)聽(tīng)器只監(jiān)聽(tīng) `product:*` 鍵 ProductKeyExpirationListener listener = new ProductKeyExpirationListener(container); container.addMessageListener(listener, new ChannelTopic("__keyevent@0__:expired")); return listener; } }
按KEY監(jiān)聽(tīng)
監(jiān)聽(tīng)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)聽(tīng)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)聽(tīng)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)聽(tīng)Redis鍵過(guò)期事件(過(guò)期監(jiān)聽(tīng))的文章就介紹到這了,更多相關(guān)SpringBoot 監(jiān)聽(tīng)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-08MyBatis多表關(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-03Springboot如何獲取上下文ApplicationContext
這篇文章主要介紹了Springboot如何獲取上下文ApplicationContext,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息解決
這篇文章主要為大家介紹了RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息原因及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11mybatis-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-06Java如何實(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)聽(tīng)器@EntityListeners注解的使用實(shí)例
這篇文章主要介紹了JPA實(shí)體類監(jiān)聽(tīng)器@EntityListeners注解的使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08