redis緩存 面試總結


緩存的收益和成本

1、緩存帶來的回報

高速讀寫:緩存加速讀寫速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盤讀寫、瀏覽器緩存、Ehcache緩存數據庫結果

降低后端負載:后端服務器通過前端緩存降低負載: 業務端使用Redis降低后端MySQL負載等

2、緩存帶來的代價

數據不一致:緩存層和數據層有時間窗口不一致,和更新策略有關    

代碼維護成本:原本只需要讀寫MySQL就能實現功能,但加入了緩存之后就要去維護緩存的數據,增加了代碼復雜度。

堆內緩存可能帶來內存溢出的風險影響用戶進程,如ehCache、loadingCache:

堆內緩存是由jvm分配的緩存

  • jvm運行時數據區:堆、java虛擬機棧、方法區、本地方法棧、程序計數器

堆內緩存和遠程服務器緩存redis的選擇

  • 堆內緩存一般性能更好,遠程緩存需要套接字傳輸
  • 用戶級別緩存盡量采用遠程緩存
  • 大數據量盡量采用遠程緩存,服務節點化原則

redis的特性

redis有哪些特性

  • 豐富的數據類型
  • 可用於緩存,消息按key設置過期時間,過期后自動刪除   setex  set expire時間
  • 支持持久化方式rdb和aof
  • 主從分布式,redis支持主從支持讀寫分離 redis cluster,動態擴容方式。

你用過redis的哪幾種特性

  • 用sorted Set實現過排行榜項目
  • 用過期key結合springboot cache實現過緩存存儲
  • redis實現分布式環境seesion共享
  • 用布隆過濾器解決過緩存穿透
  • redis實現分布式鎖
  • redis實現訂單重推系統

redis緩存雪崩

1、什么是緩存雪崩?你有什么解決方案來防止緩存雪崩?

如果緩存集中在一段時間內失效,發生大量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。
由於原有緩存失效,新緩存未到期間所有原本應該訪問緩存的請求都去查詢數據庫了,而對數據庫CPU 和內存造成巨大壓力,嚴重的會造成數據庫宕機。

2、你有什么解決方案來防止緩存雪崩?

1、數據預熱

緩存預熱就是系統上線后,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在用戶請求的時候,先查詢數據庫,然后再將數據緩存的問題!用戶直接查詢事先被預熱的緩存數據!可以通過緩存reload機制,預先去更新緩存,再即將發生大並發訪問前手動觸發加載緩存不同的key。

2、雙層緩存策略

C1為原始緩存,C2為拷貝緩存,C1失效時,可以訪問C2,C1緩存失效時間設置為短期,C2設置為長期

3、定時更新緩存策略

失效性要求不高的緩存,容器啟動初始化加載,采用定時任務更新或移除緩存

5、設置不同的過期時間,讓緩存失效的時間點盡量均勻

redis的緩存穿透

什么是緩存穿透?

緩存穿透是指查詢一個一定不存在的數據,由於緩存是不命中時被動寫的,並且出於容錯考慮,如果從存儲層查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到存儲層去查詢,失去了緩存的意義。在流量大時,可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。

防止緩存穿透的解決方案

  • 緩存空值

如果一個查詢返回的數據為空(不管是數據不 存在,還是系統故障)我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鍾。 通過這個直接設置的默認值存放到緩存,這樣第二次到緩沖中獲取就有值了,而不會繼續訪問數據庫。

  • 采用布隆過濾器BloomFilter->優勢占用內存空間很小,bit存儲。性能特別高。

將所有可能存在的數據哈希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力

 


免責聲明!

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



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