<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        redis是怎么監控失效的key

        來源:懂視網 責編:小采 時間:2020-11-09 06:58:38
        文檔

        redis是怎么監控失效的key

        redis是怎么監控失效的key:先來看一個問題:如何處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態?解決方案:可以利用redis天然的key自動過期機制,下單時將訂單id寫入redis,過期時間30分鐘,30分鐘后檢查訂單狀態,如果未支付,則進行處理但是key過期了redis有通
        推薦度:
        導讀redis是怎么監控失效的key:先來看一個問題:如何處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態?解決方案:可以利用redis天然的key自動過期機制,下單時將訂單id寫入redis,過期時間30分鐘,30分鐘后檢查訂單狀態,如果未支付,則進行處理但是key過期了redis有通

        先來看一個問題:

        如何處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態?

        解決方案:

        可以利用redis天然的key自動過期機制,下單時將訂單id寫入redis,過期時間30分鐘,30分鐘后檢查訂單狀態,如果未支付,則進行處理但是key過期了redis有通知嗎?答案是肯定的。

        開啟redis key過期提醒

        修改redis相關事件配置。找到redis配置文件redis.conf,查看“notify-keyspace-events”的配置項,如果沒有,添加“notify-keyspace-events Ex”,如果有值,添加Ex,相關參數說明如下:

        K:keyspace事件,事件以__keyspace@<db>__為前綴進行發布; 
        E:keyevent事件,事件以__keyevent@<db>__為前綴進行發布; 
        g:一般性的,非特定類型的命令,比如del,expire,rename等; 
        $:字符串特定命令; 
        l:列表特定命令; 
        s:集合特定命令; 
        h:哈希特定命令; 
        z:有序集合特定命令; 
        x:過期事件,當某個鍵過期并刪除時會產生該事件; 
        e:驅逐事件,當某個鍵因maxmemore策略而被刪除時,產生該事件; 
        A:g$lshzxe的別名,因此”AKE”意味著所有事件。

        redis測試:

        打開一個redis-cli ,監控db0的key過期事件

        127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
        Reading messages... (press Ctrl-C to quit)
        1) "psubscribe"
        2) "__keyevent@0__:expired"
        3) (integer) 1

        打開另一個redis-cli ,發送定時過期key

        127.0.0.1:6379> setex test_key 3 test_value

        觀察上一個redis-cli ,會發現收到了過期的keytest_key,但是無法收到過期的value test_value

        127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
        Reading messages... (press Ctrl-C to quit)
        1) "psubscribe"
        2) "__keyevent@0__:expired"
        3) (integer) 1
        1) "pmessage"
        2) "__keyevent@0__:expired"
        3) "__keyevent@0__:expired"
        4) "test_key"

        在springboot中使用

        pom 中添加依賴

        <!-- redis -->
         <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>

        定義配置RedisListenerConfig

        import edu.zut.ding.listener.RedisExpiredListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.listener.PatternTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;/**
         * @Author lsm
         * @Date 2018/10/27 20:56
         */@Configurationpublic class RedisListenerConfig { @Bean
         RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        
         RedisMessageListenerContainer container = new RedisMessageListenerContainer();
         container.setConnectionFactory(connectionFactory);// container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
         return container;
         }
        }

        定義監聽器,實現KeyExpirationEventMessageListener接口,查看源碼發現,該接口監聽所有db的過期事件keyevent@*:expired"

        import edu.zut.ding.constants.SystemConstant;import edu.zut.ding.enums.OrderState;import edu.zut.ding.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;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;/**
         * 監聽所有db的過期事件__keyevent@*__:expired"
         * @author lsm
         */@Componentpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer);
         } /**
         * 針對redis數據失效事件,進行數據處理
         * @param message
         * @param pattern
         */
         @Override
         public void onMessage(Message message, byte[] pattern) { // 用戶做自己的業務處理即可,注意message.toString()可以獲取失效的key
         String expiredKey = message.toString(); if(expiredKey.startsWith("Order:")){ //如果是Order:開頭的key,進行處理
         }
         }
        }

        或者打開RedisListenerConfig中 container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); 注釋,再定義監聽器,監控__keyevent@0__:expired事件,即db0過期事件。這個地方定義的比較靈活,可以自己定義監控什么事件。

        import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;/**
         * @author lsm
         */public class RedisExpiredListener implements MessageListener { /**
         * 客戶端監聽訂閱的topic,當有消息的時候,會觸發該方法;
         * 并不能得到value, 只能得到key。
         * 姑且理解為: redis服務在key失效時(或失效后)通知到java服務某個key失效了, 那么在java中不可能得到這個redis-key對應的redis-value。
         * * 解決方案:
         * 創建copy/shadow key, 例如 set vkey "vergilyn"; 對應copykey: set copykey:vkey "" ex 10;
         * 真正的key是"vkey"(業務中使用), 失效觸發key是"copykey:vkey"(其value為空字符為了減少內存空間消耗)。
         * 當"copykey:vkey"觸發失效時, 從"vkey"得到失效時的值, 并在邏輯處理完后"del vkey"
         * 
         * 缺陷:
         * 1: 存在多余的key; (copykey/shadowkey)
         * 2: 不嚴謹, 假設copykey在 12:00:00失效, 通知在12:10:00收到, 這間隔的10min內程序修改了key, 得到的并不是 失效時的value.
         * (第1點影響不大; 第2點貌似redis本身的Pub/Sub就不是嚴謹的, 失效后還存在value的修改, 應該在設計/邏輯上杜絕)
         * 當"copykey:vkey"觸發失效時, 從"vkey"得到失效時的值, 并在邏輯處理完后"del vkey"
         * 
         */
         @Override
         public void onMessage(Message message, byte[] bytes) { byte[] body = message.getBody();// 建議使用: valueSerializer
         byte[] channel = message.getChannel();
         System.out.print("onMessage >> " );
         System.out.println(String.format("channel: %s, body: %s, bytes: %s"
         ,new String(channel), new String(body), new String(bytes)));
         }
        
        }

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        redis是怎么監控失效的key

        redis是怎么監控失效的key:先來看一個問題:如何處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態?解決方案:可以利用redis天然的key自動過期機制,下單時將訂單id寫入redis,過期時間30分鐘,30分鐘后檢查訂單狀態,如果未支付,則進行處理但是key過期了redis有通
        推薦度:
        標簽: 過期 失效 re
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 婷婷国产偷v国产偷v亚洲| 国产成人高清精品免费观看| 亚洲熟妇丰满xxxxx| 九九视频高清视频免费观看| 久久久精品2019免费观看| 男女啪啪永久免费观看网站| 亚洲女久久久噜噜噜熟女| 亚洲自偷自偷在线成人网站传媒| 最近最新高清免费中文字幕| 热99re久久精品精品免费| 亚洲精品无码久久久久A片苍井空| 久久国产高潮流白浆免费观看| 亚洲AV无码码潮喷在线观看| 美女被爆羞羞网站在免费观看| 国产h视频在线观看网站免费| 久久久久噜噜噜亚洲熟女综合 | 久久久久久噜噜精品免费直播| 国产精品久久久久久久久久免费 | 亚洲一区二区影院| 精品97国产免费人成视频| 亚洲综合熟女久久久30p| 国产成人久久精品亚洲小说| 最近中文字幕无免费| 国产亚洲精aa在线看| 毛片大全免费观看| 猫咪免费观看人成网站在线| 红杏亚洲影院一区二区三区| 日韩人妻无码精品久久免费一| 亚洲码国产精品高潮在线| 99久久免费中文字幕精品| 亚洲日本国产综合高清| gogo全球高清大胆亚洲| 男女交性无遮挡免费视频| 免费一看一级毛片| 无码日韩人妻AV一区免费l| 亚洲av无码不卡私人影院| 日韩在线观看免费| 亚洲欧洲日产专区| 欧美日韩国产免费一区二区三区| 午夜在线亚洲男人午在线| 亚洲国产天堂久久综合网站|