後端 Java 開發人員使用Redis時的注意事項

2021-08-15 03:51:49 字數 2708 閱讀 6261

後端開發人員在使用redis時的注意事項,我們分為設計階段和使用階段來講,先講設計階段。

設計階段

1.快取資料篩選

我們知道redis是乙個快取資料庫,他的資料都是存放在記憶體中的,所以能夠實現高效的訪問和寫入,但記憶體單位的高昂代價注定了其難以取代磁碟,作為資料的最終儲存介質。使用快取最重要的作用就是降低儲存層的承受壓力,提高請求的響應速度,所以如何選擇資料很關鍵。注定了不能快取所有資料,那麼站在儲存層的角度,自然優先快取那些訪問最頻繁的資料,也就是所謂的熱點資料,如何判斷是否為熱點資料需要根據實際的業務場景作相應的擇取。站在應用的角度,自然是將那些響應時間長的資料做快取,能夠有效的提高使用者的使用體驗。站在快取的角度上,自然是希望快取那些更新不是很頻繁的資料,否則頻繁的快取重建就失去了快取的意義了。站在redis的角度,自然是希望能夠將自身優勢發揮出來的,快取那些資料量不是很大,但是很關鍵的資料,比如使用者登入資訊等,同時能夠發揮自身特點,比如高速儲存和寫入,可以執行簡單的算術操作,可以設定被動過期時間等。從多個方面考慮快取資料的篩選問題,是設計階段應該優先考慮的事情。

2.快取粒度控制

粒度,就是快取是資料的相對多少問題。粒度越大,操作時越簡單,但占用空間越多,且快取重建時需要的資源就越多;粒度越小,控制越複雜,但占用空間想小,且快取重建時需要的資源就越少,這就是乙個快取效能,空間和操作的平衡問題。假設使用者的資訊由a,b,c三部分組成,每次獲取的時候a和b用的較多,c用的不多,此時快取的策略有4中情況:

1. a,b,c合併後快取

2. a,b合併緩衝,c不作快取

3. a,b,c各自分開快取

4. a,b快取,c不作快取

每種快取策略均有各自的優勢及侷限性,第一種情況下,從快取提取簡單,但佔據空間大,且若a,b,c中的乙個資料發生改變均需要重建整個快取;第二種情況能降低佔據空間,但是提高提取快取的操作複雜性;第三種策略提取操作最複雜,佔據空間大,但是重建快取的效能最好;第四種能降低佔據空間,但是提高了快取重建的複雜性。

如何權衡快取的粒度控制,需要根據實際業務提前設計好。

3.快取更新策略

根據不同的業務場景指定不同的快取更新策略。

一致性:快取資料和真實資料來源的資料一致。

對於低一致性要求的業務場景,可以配置redis的最大記憶體配合淘汰策略作用。快取淘汰策略可以使用lru(least recently used),lfu(least frequently used)和fifo(first in first out)等。

對於高一致性要求的業務場景,可以使用redis的超時剔除和主動更新策略。

4.快取穿透優化

快取穿透是指查詢乙個根本不存在的資料,快取層和儲存層都不會命中。通常處於容錯的考慮,如果從儲存層查詢不到資料則不會寫入快取層。快取穿透將導致請求不存在的資料每次都要到儲存層去在找,就失去了快取保護後端儲存的意義。

造成快取穿透的原因主要有兩個:

1. 自身業務**或者資料出現問題

2. 一些惡意攻擊或爬蟲造成大量空命中

對於快取穿透,可以給不存在的資料快取乙個空物件,同時設定超時時間。如果在此期間快取層和儲存層的資料不一致,可使用訊息系統或者其他操作剔除快取中的空物件。

5.熱點key重建

對於併發量較大的應用,當乙個熱點key重建時,可能會觸發多個執行緒同時執行重建工作。多個執行緒同時重建,耗費額外效能生成資源,同時可能會有多次的快取替換操作,對整體效能可能有一定影響。此時可以使用互斥鎖機制,保證同一時間對於同一key只有乙個執行緒能夠執行重建工作。但是要注意,如果重建工作耗時較長,可能存在死鎖和執行緒阻塞的風險。

6.快取雪崩應對

快取的層級位於客戶端和儲存層之間,能夠有效的降低儲存層的壓力,但快取可能存在不可用的情況,如何應對這種情形?

首先自然是降低快取層的宕機機率,有條件可以使用redis sentinel和redis cluster。

其次隔離快取和儲存層的資料獲取介面,防止快取的宕機影響儲存層的資料獲取。

最後在專案上線前演練快取宕機的情形,在此基礎上做一預案設定。

好的架構和**都需要有乙個好的設計,如果設計階段就出了偏差,那麼在程式設計階段無論怎麼調整都難以彌補。

使用階段

我們從資料儲存和資料獲取兩個方面來說明開發時的注意事項。

1.資料儲存2.資料查詢

redis是一種資料庫,和其他資料庫一樣,操作時也需要有連線物件,連線物件的建立和銷毀也需要耗費資源,復用連線物件很有必要,所以推薦使用連線池來管理連線。

redis資料儲存在記憶體中,查詢很快,但不代表連線也很快。一次redis查詢可能io部分佔據了請求時間的絕大部分比例,縮短io時間是開發過程中很需要注意的一點。

對於乙個業務內的多次查詢,考慮使用pipeline,將多次查詢合併為一次查詢,命令會被執行多次,但是只有乙個io傳輸,能夠有效的提高響應速度。

對於多次string型別的查詢,使用mget,將多次請求合併為一次,同時命令和會被合併為一次,能有效提高響應速度,對於hash內多個field查詢,使用hmget,起到和mget同樣的效果。

redis是單執行緒執行的,也就是說同一時間只能執行一條命令,如果一條命令執行的時間較長,其他執行緒在此期間均會被阻塞,所以在操作redis時要注意操作指令的涉及的資料量,盡量降低單次操作的執行時間。

IT開發人員

其路五 轉行到市場 絞盡腦汁的想想,我所知道的人之中只有兩個開發人員去了市場,這兩個人都不能說是朋友,認識而已。他們都是主動要求去了市場,結果是這兩個人均在市場都是乾到一年左右,然後都自已開公司了。呵呵,很奇怪,極高的轉行成功率!不過仔細想想,我對這兩個人的思路佩服的五體投地。能下決心仍掉每月5 6...

開發人員必讀

對於剛開始學習軟體開發的新人來說,必備技能 往往意味著乙個長長的 標有重要度的學習列表,但是過長的列表通常會導致新人不知如何開始學習,壓力倍增。本文嘗試列舉出最重要的幾個技能,也期望通過此列表能給新人乙個比較明確的學習重點和路徑。沒有掌握任何一門程式語言,就不可能成為一名程式設計人員。許多程式設計師...

開發人員Git基本使用

基本的命令 git clone git gitlab.miteke.com lilia testgit.git 用clone 就不用remote add origin了 或git init git remote add origin git gitlab.miteke.com lilia testg...