掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在開發(fā)正在正火熱的分布式服務中,Redis作為一個關(guān)鍵的存儲組件經(jīng)常被使用。

創(chuàng)新互聯(lián)建站專注于江山網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供江山營銷型網(wǎng)站建設,江山網(wǎng)站制作、江山網(wǎng)頁設計、江山網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務,打造江山網(wǎng)絡公司原創(chuàng)品牌,更為您提供江山網(wǎng)站排名全網(wǎng)營銷落地服務。
比如在項目中經(jīng)常會用Redis來儲存賬號的Session以及超時的定時任務等等,而常用的會話或任務都會有一個時間的概念:**過期時間**。那么如何監(jiān)聽準確的Redis過期時間一直是持續(xù)困擾著大家的問題。
對于Redis有兩種比較常見的過期時間偵聽方案:
1. 將Redis中存儲的內(nèi)容設置有過期時間,然后再由程序定時向Redis中輪詢查看有沒有過期鍵值;
2. 采用Redis自身提供的 Keyspace Notification 的事件機制,即 Redis Log 的 Keyspace[expired] 事件,當發(fā)生鍵過期時,會自動發(fā)出一個 ‘__keyspace@xx__:keyname’ 的 Channel,接收這樣的 Channel 信息則知道key的過期了。
而我拿到這個任務的時候恰好是COVID后的大年初一,本以為會42度的熱情迎接新年,結(jié)果理想遠異于現(xiàn)實:加起來的坑也有數(shù)十個,實現(xiàn)程序的Redis過期監(jiān)聽可謂困難重重。
首先嘗試的方案便是大家常用的輪詢檢查Redis中過期鍵值,但顯而易見的是,當Redis服務器中過期鍵值數(shù)量較大時,輪詢檢查壓力肯定會很大,并且比較耗時。再如檢查間隔只有一分鐘,可謂是一種浪費時間,尤其是有可能某些鍵值在一分鐘內(nèi)被重新設置,但未來也無法得知。
因此,我又轉(zhuǎn)向采用Redis Log 的 Keyspace[expired] 事件來進行過期監(jiān)聽的嘗試,于是安裝了Redis的源碼,通過Flume將Redis的 Log 事件引入Flume實時傳輸給Kafka,然后再利用Kafka自帶的Offset提取想要的信息。期間也折騰了不少,比如Flume無法將接收原始信息傳輸給Kafka,排查到久參數(shù)沒有正確設置;比如Flume把Redis Log事件傳給Kafka之后,超過32G大小的log被跳過分發(fā)而導致實際的過期監(jiān)聽無法展開,排查到這兒原因是沒有正確限定長度模板并且類型是StringIndex。
最終,經(jīng)過大量的坑和折騰,終于在一個清涼的night中完成了Redis的過期監(jiān)聽任務,哈哈,網(wǎng)上查了各種資料,總算是能把Redis的過期監(jiān)聽實現(xiàn)了!如今,有了這招,可以為我們實現(xiàn)中byte級別準確及時的檢測。
“` java
// Flume 配置文件。
# redis source 定義
[agent-name]
maxBatchSize = 1000
maxFileSize = 10485760
# tl source 定義
[agent-name]
type = exec
command = tl -F /home/monit_rpdp/usr/local/redis/logs/redis.log
# sink 定義
[agent-name]
type = org.apache.flume.sink.kafka.KafkaSink
topic = redis_expired
kafka.bootstrap.servers = localhost:9092
kafka.metadata.broker.list = localhost:9092
kafka.request.required.acks = 1
[agent-name]
key.serializer = org.apache.kafka.common.serialization.StringSerializer
# key.serializer = org.apache.kafka.common.serialization.StringIndexSerializer
value.serializer = org.apache.kafka.common.serialization.StringSerializer
# value.serializer = org.apache.kafka.common.serialization.StringIndexSerializer
# value.serializer = org.apache.kafka.common.serialization.ByteArraySerializer
# value.serializer = org.apache.kafka.common.serialization.ByteArrayIndexSerializer
最終,Redis過期時間監(jiān)聽的實現(xiàn)可謂是一次漫長卻又有成就感的探索之旅,相信有了這樣的經(jīng)歷,以后接下來的類似問題難度也不大,溫故而知新,只有不斷地折騰才能得出更
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流