• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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是怎么監(jiān)控失效的key

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

    redis是怎么監(jiān)控失效的key

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

    先來看一個問題:

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

    解決方案:

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

    開啟redis key過期提醒

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

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

    redis測試:

    打開一個redis-cli ,監(jiān)控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 ,發(fā)送定時過期key

    127.0.0.1:6379> setex test_key 3 test_value

    觀察上一個redis-cli ,會發(fā)現(xiàn)收到了過期的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;
     }
    }

    定義監(jiān)聽器,實現(xiàn)KeyExpirationEventMessageListener接口,查看源碼發(fā)現(xiàn),該接口監(jiān)聽所有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;/**
     * 監(jiān)聽所有db的過期事件__keyevent@*__:expired"
     * @author lsm
     */@Componentpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer);
     } /**
     * 針對redis數(shù)據(jù)失效事件,進行數(shù)據(jù)處理
     * @param message
     * @param pattern
     */
     @Override
     public void onMessage(Message message, byte[] pattern) { // 用戶做自己的業(yè)務處理即可,注意message.toString()可以獲取失效的key
     String expiredKey = message.toString(); if(expiredKey.startsWith("Order:")){ //如果是Order:開頭的key,進行處理
     }
     }
    }

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

    import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.connection.MessageListener;/**
     * @author lsm
     */public class RedisExpiredListener implements MessageListener { /**
     * 客戶端監(jiān)聽訂閱的topic,當有消息的時候,會觸發(fā)該方法;
     * 并不能得到value, 只能得到key。
     * 姑且理解為: redis服務在key失效時(或失效后)通知到java服務某個key失效了, 那么在java中不可能得到這個redis-key對應的redis-value。
     * * 解決方案:
     * 創(chuàng)建copy/shadow key, 例如 set vkey "vergilyn"; 對應copykey: set copykey:vkey "" ex 10;
     * 真正的key是"vkey"(業(yè)務中使用), 失效觸發(fā)key是"copykey:vkey"(其value為空字符為了減少內存空間消耗)。
     * 當"copykey:vkey"觸發(fā)失效時, 從"vkey"得到失效時的值, 并在邏輯處理完后"del vkey"
     * 
     * 缺陷:
     * 1: 存在多余的key; (copykey/shadowkey)
     * 2: 不嚴謹, 假設copykey在 12:00:00失效, 通知在12:10:00收到, 這間隔的10min內程序修改了key, 得到的并不是 失效時的value.
     * (第1點影響不大; 第2點貌似redis本身的Pub/Sub就不是嚴謹?shù)? 失效后還存在value的修改, 應該在設計/邏輯上杜絕)
     * 當"copykey:vkey"觸發(fā)失效時, 從"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)));
     }
    
    }

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

    文檔

    redis是怎么監(jiān)控失效的key

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国内精品久久久久影院日本| 精品精品国产自在久久高清| 国产福利91精品一区二区| 精品久久久久久国产免费了| 国产成人精品天堂| 无码精品A∨在线观看中文| 久久99精品国产麻豆蜜芽| 国内精品伊人久久久久| 日韩精品真人荷官无码| 欧美精品手机在线播放| 欧美精品丝袜久久久中文字幕| 91麻精品国产91久久久久| laowang在线精品视频| 日韩精品极品视频在线观看免费| 精品水蜜桃久久久久久久| 99久久精品无码一区二区毛片| 国产成人精品高清在线观看99| 久久久免费精品re6| 亚洲精品美女久久久久99小说| 精品国产一区二区三区在线观看 | 亚洲精品久久久www| 久久99精品国产麻豆蜜芽| 国产午夜精品一本在线观看| 久久精品嫩草影院| 国产精品多p对白交换绿帽| 久久久久人妻精品一区二区三区| 亚洲一区二区三区国产精品| 日韩精品视频在线观看免费| 久久久精品视频免费观看| 国产精品爽爽ⅴa在线观看| 国产精品白丝AV嫩草影院| 99热都是精品久久久久久| 国产成人亚洲精品影院| 99久久伊人精品综合观看| 国产精品乱视频| 精品久久国产一区二区三区香蕉| 久久精品18| 中文字幕精品一区二区精品| 少妇人妻偷人精品免费视频| 蜜臀久久99精品久久久久久小说 | 91av国产精品|