1. 程式人生 > 資料庫 >Redis專題 - 重要知識點

Redis專題 - 重要知識點

為了提高系統的訪問效率和降低伺服器壓力,我們通常會採用快取的策略,而使用快取可以有效地支援高效能和高併發,而我們常用redis作為快取!

1.快取的作用

高效能
使用者第一次訪問資料庫中的某些資料時,是從硬碟中讀取的,該過程緩慢。而操作快取是直接操作記憶體,速度快。所以,當第一次訪問後,將資料儲存在快取,若資料庫中的資料有變動,則同步改變快取中相應的資料。
在這裡插入圖片描述
高併發
直接操作快取能夠承受的請求是遠遠大於直接訪問資料庫的,可以將熱點資料儲存到快取中,從而使部分請求直接到達快取,而不用經過資料庫,降低伺服器壓力的同時,提高了併發量。
在這裡插入圖片描述
為了更好地引入快取一致性的問題,先來講下redis的持久化策略、過期鍵的刪除策略和記憶體淘汰策略。

1.redis持久化策略。

首先,redis支援RDB(預設)和AOF兩種持久化策略。

a) RDB:Redis Database。RDB是Redis預設的持久化方式。每隔一定的時間週期就將記憶體的資料以快照的形式儲存到硬碟中,對應產生的資料檔案為dump.rdb。通過配置檔案中的save引數可以設定生成快照的時間週期。
在這裡插入圖片描述
RDB的優缺點:

優點:

1、只有一個檔案dump.rdb,方便持久化;
2、容災性好,一個檔案可以儲存到安全的磁碟;
3、效能最大化。使用單獨子程序來進行持久化,主程序不會進行任何IO操作,保證了redis的高效能;
4、相對於資料集大時,比AOF的啟動效率更高

缺點:

1、資料安全性低。因為RDB是間隔一段時間進行持久化,如果持久化之間redis發生故障,會發生資料丟失。

**b) AOF:**Append Only File。將Redis每次執行的寫命令記錄到單獨的日誌檔案中,當重啟Redis時,會從持久化的日誌檔案中重新恢復資料。
當兩種方式同時開啟時,資料恢復Redis會優先選擇AOF恢復。
在這裡插入圖片描述
AOF優缺點:

優點

1、資料安全,AOF持久化可以令屬性appendfsync為always,表示將每一次的命令操作記錄到AOF檔案中;
2、以append模式寫檔案,即使中途伺服器宕機,可以通過redis-check-aof工具解決資料一致性問題。
3、AOF機制的rewrite模式,在AOF檔案還沒被rewrite之前(當檔案過大時,會對檔案中的命令進行合併重寫),可以刪除其中的一些命令。

缺點

1、AOF檔案比RDB檔案大,且恢復速度慢。
2、資料集大的時候,比RDB啟動效率低。

c) 對RDB和AOF兩者進行對比:
如果同時配置了RDB和AOF,則優先載入AOF。

1、AOF檔案比RDB更新頻率高,優先使用AOF還原資料;
2、AOF比RDB更安全也更大
3、RDB效能比AOF好

2.過期鍵的刪除策略

使用過Redis的都知道,Redis是key-value的資料庫,我們可以設定redis快取中key的過期時間,通常採用以下三種過期鍵的刪除策略,Redis中同時使用惰性過期和定期過期兩種過期策略
在這裡插入圖片描述

3.Redis記憶體淘汰策略

Redis的記憶體淘汰策略是指用於快取的記憶體不足時,怎麼處理需要新寫入且需要申請額外空間的資料。
在這裡插入圖片描述
好了,接下來講下使用redis作為快取時的快取異常問題,即快取與資料庫的一致性問題,可以大致為分這三種:快取穿透快取擊穿快取雪崩
在這裡插入圖片描述
針對上述三種問題,有不同的解決方案。
在這裡插入圖片描述
在上面的策略中,講到了布隆過濾器,布隆過濾器也是面試中會被問到的一個知識點。
布隆過濾器只佔用很小的記憶體空間,它通過bitmap(位陣列)和雜湊對映函式來判斷某個資料是否存在,僅是進行概率判斷,即資料要麼可能大概率存在,要麼一定不存在。

a) 布隆過濾器組成及其執行過程。

布隆過濾器除了一個位數組外,還有k個雜湊函式,當一個元素加入布隆過濾器時,會執行如下操作:

1) 使用k個雜湊函式對元素進行k次計算,得到k個雜湊值;
2) 根據得到的雜湊值,在位陣列中把對應的索引位置的值置為1.

而當判斷一個值是否在布隆過濾器中時,會對該值進行k次雜湊計算,再判斷位陣列中應對的k個位置的值是否都為1,若存在一個不為1,則說明該元素不存在,否則,說明該元素存在。

b) 布隆過濾器的資料結構:其本質是一個如下圖所示的位陣列,初始值都為0,陣列元素能是0或者1,
在這裡插入圖片描述
若此時我們使用多個雜湊函式對映若干個值到布隆過濾器中,如下所示:
在這裡插入圖片描述
若此時查詢“益禾堂”,可以說該值一定存在嗎?在圖中可以看到,不同的值是存在雜湊衝突的,即不同的值存在部分雜湊值對映到位陣列的同一個位置上,而隨著儲存的值增多,會有更多的位置被置為1。當我們查詢不存在的值“星巴克”時,若此時雜湊函式返回的三個bit位(不一定是3個,根據雜湊函式確定)都為1,程式依然會判斷該值“星巴克”存在。綜上所述,上述問題只能說“益禾堂”可能存在。

此外,布隆過濾器不能刪除其中的資料,若要刪除某個值,則只能重建布隆過濾器。因為存在雜湊衝突,若有兩個不同的值對映到了相同的位置,那麼,在某個時刻查詢另一個數據時,會造成結果的錯誤。

綜上所述,可以得出如下結論:

1、只要返回資料不存在,則肯定不存在;
2、返回資料存在,但只能是大概率存在;
3、不能刪除其中的資料;
4、針對布隆過濾器的誤判行為,可以採用建立白名單的儲存可能被誤判的元素;
5、因為redis本身支援setbit和getbit操作,所以可以使用redis實現布隆過濾器,
而其建立位陣列的方式比較特殊,通過如下方式建立位陣列,
如建立一個長度為10000、名為test的布隆過濾器:setbit test 10000 0