天天看點

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

一、什麼是Redis

  Redis是一個使用C語言編寫的,開源的高性能非關系型(NoSQL)的鍵值對資料庫。Redis的資料是存在記憶體中的,是以讀寫速度很快。常用于緩存方向,每秒可處理超過10W次讀寫操作,可以用來做分布式鎖。此外,Redis支援事務、持久化等等。

  優勢:

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

二、Reids的分布式鎖

舉例:比如電商中的超賣問題,同時調用同一個接口,減少庫存數量出現錯誤。

解決方法:

1、增加鎖

問題:分布式叢集環境中通過分發之後jvm程序級别的鎖并不管用。

2、redis分布式鎖

運用Redis 的 SETNX指令 

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

減庫存運作之前,先執行SETNX指令插入一條資料。如果存在該資料,則沒搶到鎖,不執行操作,如果搶到鎖,則執行操作,并删除key。

問題:

(1)、如果中間報錯了,則會不删除key,形成死鎖。(try/catch 加入finally)

但是如果系統當機,依然無法執行解鎖操作。

(2)、設定key的逾時時間

但是還是會存在當機問題,并沒設定上key的逾時時間。

(3)、增加原子操作,插入key的時候順便設定上逾時時間,執行原子操作。

但是有可能在逾時時間之内沒有執行完内部操作,這時候其餘線程擷取到鎖,出現問題。

(4)、使用redisson,redisson底層原理:

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

  redisson加鎖并設定了逾時時間之後會開啟一個線程不斷檢測原線程是否還持有鎖,然後不斷續鎖。

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

但是分布式鎖會帶來性能問題。

(5)、 與java concurrenthashmap 類似的分段鎖.

具體:将整體拆分,比如有200個數量,分割成10個20個數量的段,分别上鎖,每次請求進來會随機一組上鎖,實作分段鎖提高性能。

三、什麼是Redis擊穿和穿透以及預防措施

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

四、什麼是Redis雪崩以及預防措施

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

五、什麼是Redis一緻性哈希實作動态擴容縮容

  一執行哈希将整個哈希值空間組織成一個虛拟的圓環,如假設某哈希函數H的空間為0-2^32-1,圓環就如下:

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

   然後下一步将各個伺服器使用Hash進行一個哈希,具體可以選擇伺服器的ip或主機名作為關鍵字進行hash,這樣每台機器就能确定其在哈希環上的位置。這樣沒台機器就在該環上有了自己的位置,然後資料進來之後,我們根據key用相同的哈希函數進行計算,計算出在該環上的位置,然後順時針行走,遇到的第一台機器就将該資料儲存到該機器。

  這樣,如果其中一天機器當機,該資料隻重定向到下一個機器上,其餘所有機器不會收到影響。一緻性hash具有較好的容錯性與可擴充性。

六、Redis的過期鍵的删除政策

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

七、Redis的記憶體淘汰政策

Redis的記憶體淘汰政策是指在Redis的用于緩存的記憶體不足時,怎麼處理需要新寫入且需要申請額外空間的資料。

全局的鍵空間選擇性移除

  • noeviction:當記憶體不足以容納新寫入資料時,新寫入操作會報錯。
  • allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key。(這個是最常用的)
  • allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,随機移除某個key。

設定過期時間的鍵空間選擇性移除

  • volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。
  • volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,随機移除某個key。
  • volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的key優先移除

八、Reids與資料庫雙寫不一緻

面試準備(七)Redis、Redis的分布式鎖、Redis的雙寫問題、Reids擊穿、穿透、雪崩

解決:

(1)、延遲雙删

線程2執行過程完。延遲一陣時間再删除一次緩存。

但是不太靠譜。

(2)、記憶體隊列

将操作放到隊列裡執行,但是順序會出問題

(3)、分布式鎖,将線程串行化執行

性能問題,串行執行

(4)、讀寫鎖

針對同一個key

讀資料之前增加讀鎖。

寫資料之前增加寫鎖。

同一個key的讀鎖與寫鎖互斥。

繼續閱讀