Redis知識小記

一、單線程的redis爲什麼這麼快?

1、Redis的所有操作都在內存中;

2、Redis是單線程的,避免了線程上下文切換引起的額外性能開銷。同時,單線程避免了多線程的數據同步問題,沒有加鎖釋放鎖操作;

3、數據結構簡單,對數據結構的操作也簡單;

4、使用多路複用IO(類似java的NIO),多路是指多個網絡連接,複用是指多個網絡連接複用同一個處理線程,處理線程會依次輪詢有IO操作的請求,避免了線程因爲IO傳輸導致的阻塞;

5、Redis構建了自己獨有的VM機制。

 

二、Redis的數據類型:1、string(字符串);2、list(列表);3、hash(哈希);4、set(集合);5、zset(有序集合,將插入的元素根據score排序)

 

三、Redis的緩存擊透、緩存擊穿、緩存雪崩:

1、緩存擊透

問題原因:大量的請求不斷訪問一個不存在的key,導致每條請求都會請求到數據庫中,最終導致數據庫崩潰;

解決方案:使用隊列或者加鎖讓請求依次查詢數據庫,緩解數據庫壓力。

2、緩存擊穿

問題原因:大量請求同時訪問同一個key,當key失效的一瞬間,所有請求將直接打到數據庫上,導致數據庫崩潰;

解決方案:1、設置緩存永不過期或者過期時間比較長;2、使用雙重備份緩存,當緩存A失效時,使用緩存B。

3、緩存雪崩:大量key在同一時間失效,所有請求直接請求到數據庫,導致數據庫崩潰;

解決方案:1、每個key設置不同的失效時間,避免所有key在同一時間失效;2、使用隊列或者加鎖使請求依次訪問數據庫。

 

四、Redis持久化的幾種方式

1、RDB:每隔一定的時間(定時)把內存的數據寫入到磁盤中;

2、AOF:將每個寫、刪除操作記錄到日誌文件中,查詢操作不會被記錄。

 

五、Redis如何保證緩存數據和數據庫數據一致性

1、設置緩存過期時間;

2、對數據庫的更新操作,都將觸發刪除redis中對應key的操作,如果刪除失敗,則將這個操作放入隊列中,另起一個線程從隊列中取任務,執行刪除該條記錄的操作(延時雙刪策略)。

 

六、基於Redis實現的分佈式鎖

使用SETNX(set not exists) key value:如果key不存在,則創建並賦值,否則失敗。創建成功的獲得鎖。

但是當獲取到鎖的副本宕機時這個關聯鎖的key也不會被刪除,就會導致其他所有需要獲取這個鎖的業務/副本阻塞。

合理的解決方式是:

1、使用SET key value [EX seconds][PX millisecond] NX

EX seconds 設置鍵的過期時間爲 seconds 秒

PX millisecond 設置鍵的過期時間爲 millisecond 秒

NX 當鍵不存在的時候才設置

但是當某個副本的操作時間大於超時時間時,就可能會導致操作還沒執行完,但鎖卻被釋放了。
2、使用Redisson的watchdog,watchdog會每隔10秒把key的超時時間重置成你設置的值,一旦客戶端宕機,watchdog也就失效了,key過了超時時間就會失效。

七、Redis的數據淘汰策略:

1、從設置了超時時間的key中挑選最近將要過期的key淘汰;

2、從設置了超時時間的key中挑選最近最少使用的key淘汰;

3、從設置了超時時間的key中隨機淘汰;

4、從數據集中挑選最近最少使用的key淘汰;

5、從數據集中隨機淘汰;

6、從不淘汰。

 

 

 

 

發佈了50 篇原創文章 · 獲贊 11 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章