新聞中心
在開發(fā)正在正火熱的分布式服務(wù)中,Redis作為一個關(guān)鍵的存儲組件經(jīng)常被使用。

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


咨詢
建站咨詢
