使用Redis需要注意的幾點


Redis作為緩存中間件,被廣泛應用在各類系統,用來提升系統性能和吞吐,下面總結幾點開發人員在使用Redis時需要考慮的幾個關鍵點:

一. key的設計

1. key命名規范:為了避免不必要的麻煩,我們要給系統定義一套key的設計規范。通俗點舉個例子,我們在電腦上寫好了一篇文章,需要保存起來,這時候我們會找個合適目錄並且取個合適的文件名,以便后續要找它的時候,能想起它的名字並找到它,key的命名就好比給你要保存的文件命名和選目錄,好的命名,能讓你很容易想起它、找到它。大多緩存場景,是將需高頻讀取低頻變更的數據從數據庫中加載到redis,比較常用的key命名規范是:表名:主鍵名:主鍵值:存儲列名,存儲列名可根據下面第2點提到的粒度問題來自行定義。比如,緩存用戶信息表user,set user:id:1:name 張三,緩存了用戶id為1的用戶的名字叫張三。

2. 粒度的把握:需要根據不同應用場景來設定。粒度越大,操作越簡單,通用性好,但空間占用大,重建緩存需要的資源也越多;粒度越小,控制越復雜,通用性差,但空間占用小,重建緩存時需要的資源就越少。緩存粒度設計不當,可能會造成很多無用空間的浪費、網絡帶寬的浪費,也可能會造成代碼通用性較差等情況,如何權衡緩存的粒度控制,需要根據實際業務提前設計好。

二. 緩存更新策略

緩存中的數據會和數據源有一段時間窗口的不一致,需要利用某些策略更新,下面介紹幾種主要的緩存更新策略。

1. LRU/LFU/FIFO:剔除算法通常用於,當緩存使用量超過預設的最大值,如何對現有的數據進行剔除。

2. 超時剔除:給緩存數據設置過期時間,過期后自動刪除,例如Redis提供的expire命令。如果業務可以容忍一段時間內,緩存層數據和存儲層數據不一致,那么可以為其設置過期時間。在數據過期后,再從真實數據源獲取數據,重新放到緩存並設置過期時間。

3. 主動更新:對數據一致性要求高,當源數據更新后,立即更新緩存,可通過MQ來實現觸發。

三. 緩存穿透

緩存穿透是指查詢一個根本不存在的數據,緩存層和存儲層都不會命中。解決緩存穿透,一般的方法有:

1. 緩存空對象。即當某個key從緩存和db都查不到時,為這個key緩存一個空對象,這樣下次來就不會擊穿到db。這樣做,會有2個隱患,一個是,如果被攻擊,則可能造成緩存大量的空對象,導致占用大量內存,可以設置比較短的過期時間來應對。另一個隱患是,如果db新增這個key的值,就會有一段時間不一致,當然這個也是數據一致性問題,通過主動更新的策略可避免。

2. 布隆過濾器。利用布隆過濾器保存在redis中存在的key,在擊穿緩存時,先查一下布隆過濾器,如果不存在,則不查db,一定程度保護了db層。

四. 熱點key重建問題

這個問題是指,某個key高並發讀,如果剛好碰上到期更新,會導致多個線程重建key,導致db負載過大,應用雪崩。要解決這個隱患,可以給重建key設置互斥鎖,確保同一時間只有一個線程重建緩存。另外,還有一個辦法就是,不設置過期時間,然后在邏輯上去控制,即邏輯上記錄一個過期時間,如果到了這個過期時間,緩存還能用,只是要通知緩存重建線程去重建。

五. 查緩存要注意

1. 使用連接池來管理連接。
2. 一個業務多次查詢,考慮用Pipeline,將多次查詢合並為一次,雖然命令會被執行多次,但節省IO,能有效提高響應速度。
3. 多次String查詢,使用mget,將多次請求合並為一次,命令也會被合並為一次,能有效提高響應速度,對於Hash內多個Field查詢,使用hmget,起到和mget同樣的效果。
4. Redis是單線程執行的,如果一條命令執行時間較長,其他線程在此期間會被阻塞,所以在操作Redis時要注意操作指令的涉及的數據量,盡量降低單次操作的執行耗時,比如要慎用模糊匹配。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM