您好,登錄后才能下訂單哦!
本篇內容介紹了“Redis生產場景問題以及解決方案”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
1、緩存穿透
緩存穿透是指查詢一個根本不存在的數據, 緩存層和存儲層都不會命中, 通常出于容錯的考慮,
如果從存儲 層查不到數據則不寫入緩存層。 緩存穿透將導致不存在的數據每次請求都要到存儲層去查詢, 失去了緩存保護后端存儲的意義。
造成緩存穿透的基本原因有兩個:
第一, 自身業務代碼或者數據出現問題。
第二, 一些惡意攻擊、 爬蟲等造成大量空命中。
解決方案
1-1、緩存空對象
1-2、布隆過濾器
2、緩存失效
比如在管理后臺批量設置了大量的緩存數據,那么在某個時間大量的key在相同的時間同時失效,這樣大量來自用戶端的請求就會直接請求到數據庫層,造成數據庫端瞬間壓力增大,這種情況即為緩存失效。
解決方案:在批量設置key時,過期時間通過隨機時間的方式來設置,可以避免這種問題的發生
3、讀寫不一致解決方案
(1)并發量小,或者是用戶想關的數據基本不會有并發,設置過期時間即可
(2)利用分布式鎖解決讀寫不一致的問題
Redisson readWriteLock、讀讀不互斥,讀寫互斥
(3)canal中間件方案
利用canal中間件,可以解決讀寫不一致的問題,程序只需關注緩存或數據庫自身即可,同步的事情交給中間件canal來完成
5、通過連接池方式訪問redis,提高訪問效率
示例代碼-->
https://gitee.com/ggkt/java-base/blob/master/src/com/ggkt/redis/RedisPool.java
6、連接池預熱
示例代碼->
https://gitee.com/ggkt/java-base/blob/master/src/com/ggkt/redis/RedisPoolPreLoad.java
如果系統有大量并發,為了提交redis效率,客戶端可以提前將redis連接預熱到連接池,規避瞬間redis訪問的壓力
7、過期key清除原理
(1)、被動刪除,key過期了并不會自動清除,過期時間后有訪問了才會清除
(2)、主動刪除,redis會定期淘汰過期key;
(3)、超過maxmemory也會觸發清理策略
8、主動刪除策略
主動清理策略在Redis 4.0 之前一共實現了 6 種內存淘汰策略,在 4.0 之后,又增加了 2 種策 略,總共8種:
8-1、設置了過期時間的key的刪除
(1)volatile-ttl:按照過期時間先后刪除
(2)volatile-random:按照過期時間隨機刪除
(3)volatile-lru:按照過期時間lru隨機刪除
(4)volatile-lfu:按照過期時間lfu隨機刪除
8-2、針對所有的key的刪除
(5) allkeys-random:從所有鍵值對中隨機選擇并刪除數據。
(6)allkeys-lru:使用 LRU 算法在所有數據中進行篩選刪除。
(7)allkeys-lfu:使用 LFU 算法在所有數據中進行篩選刪除。
8-3、不處理
(8) noeviction:不會剔除任何數據,拒絕所有寫入操作并返回客戶端錯誤信息"(error)
OOM command not allowed when used memory",此時Redis只響應讀操作。
9、最大內存設置
生產環境一定要設置最大內存,否則,如果如果內存數據超過了物理內存
則會使用swap分區進行內存的存儲,這樣增加了磁盤io讀寫、數據交換,大大降低服務及服務器性能。
而設置了最大內存就會內存達到一定的值就會觸發redis的內存清理機制,可以保證redis的效率
10、模擬程序打爆你的redis
“Redis生產場景問題以及解決方案”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。