天天看點

Redis、Redis緩存-面試篇

Redis、Redis緩存-面試篇

1、Redis是一個基于記憶體的高性能key-value資料庫,支援豐富的資料類型:string、list、set、zset(sorted set,有序集合)、hash。

2、最适合Redis的場景有哪些?

(1)會話緩存

(2)全頁緩存

(3)隊列

(4)排行榜/計數器

(5)釋出/訂閱

3、為什麼redis需要把所有資料都放到記憶體中去?

Redis為了達到最快的讀寫速度将資料都讀取到記憶體中,并通過異步的方式将資料寫入磁盤。(在記憶體越來越便宜的時代,redis将越來越受歡迎)

4、Redis與Memcache的差別:

(1)存儲方式不同。Redis存儲在硬碟上,這樣可以保證資料的持久性。而Memcache是将資料全部存在記憶體中,資料不能超過記憶體大小,并且斷電後資料庫會挂掉。

(2)支援的value大小不一樣。Redis最大可以達到1GB,而Memcache隻有1MB。

(3)Redis相較于Memcache有豐富的資料類型。

(4)Redis的速度比Memcache快很多。

5、Redis的缺點

由于Redis是記憶體資料庫,是以單台機器存儲的資料量直接與機器本身的記憶體大小挂鈎。雖然redis本身有key過期政策,但是還是需要提前預估和節約記憶體。如果記憶體增長過快,需要定期删除資料。

6、為什麼Redis是單線程?

因為Redis是記憶體資料庫,CPU不是Redis的瓶頸,又因為單線程容易實作,相比多線程會減少很多麻煩。

7、Redis是單線程,但Redis為什麼還是這麼快?

(1)完全基于記憶體,非常快速。

(2)資料結構簡單,對資料操作也簡單。(Redis中的資料結構是專門進行設計的)

(3)采用單線程,避免了多線程的麻煩。

(4)使用多路I/O複用模型,非阻塞IO。

(5)Redis自己建構了VM機制,調用函數時無需再浪費一定的時間去移動和請求。

8、緩存雪崩問題:如果緩存宕[dàng] 機了或者緩存設定了相同的過期時間導緻緩存在同一時刻同時失效,請求全部直接落到資料庫導緻崩潰。

解決方案:

(1)事前:redis高可用,主從+哨兵,redis cluster叢集分布,避免全盤崩潰。

(2)事中:本地ehcache緩存+hystrix限流和降級,避免mysql被打死。

(3)事後:redis持久化RDB+AOF,快速恢複緩存資料。

(4)緩存的失效時間設定為随機值,避免同時失效。

9、緩存穿透問題:大量不合理請求參數,緩存不起作用,進而直接打死資料庫。

解決方案:

(1)對請求參數j進行校驗,不合理直接傳回。

(2)使用布隆過濾器,快速判斷key是否在資料庫中存在,不存在直接傳回。

10、緩存擊穿問題:熱點資料的緩存失效。

解決方案:

(1)設定key永不過期,或者快過期時通過另一個異步線程重新設定key

(2)當從緩存拿到的資料為null時,對重新從資料庫加載資料的過程上鎖。