Redis概念進階
1、什麼是Redis(Remote Dictionary Server)
Redis本質上是一個key-value型別的記憶體資料庫,整個資料庫載入在記憶體中進行操作,定期通過非同步操作把資料庫資料flush到硬碟上進行儲存。因為是純記憶體操作,Redis的效能非常出色,每秒可以處理超過10萬次讀寫操作,是已知效能最快的key-value DB。
Redis支援多種資料結構:String、List、Hash、Set、 Sorted Set,單個value的最大限制是1GB。使用Redis可以用List來做FIFO雙向連結串列,實現一個輕量級的高效能訊息佇列服務;用Set做高效能的tag系統。Redis還可以對存入的key-value設定expire時間。
Redis由於資料庫容量受到實體記憶體的限制,不能用作海量資料的高效能讀寫(可以用MongoDB或者ElasticSearch),因此它的適用場景主要是在較小資料量的高效能操作和運算上。(可以做中介軟體)
2、Redis的資料淘汰策略
- noeviction:不刪除策略,達到最大記憶體限制時,如果需要更多記憶體,直接返回錯誤的資訊;
- allkeys-lru:所有key通用,優先刪除最近最少使用的key(least recently used,LRU);
- allkeys-random:所有key通用,隨機刪除一部分key;
- volatile-lru:只限於設定了expire的部分,嘗試回收最少使用的鍵;
- volatile-random:只限於設定了expire的部分,隨機刪除一部分expire的key;
- volatile-ttl:只限於設定了expire的部分,優先刪除剩餘時間端的key(time to time , ttl)
3、Redis為什麼要把資料放到記憶體中
Redis為了達到最快的讀寫速度將資料都讀到記憶體中,並通過記憶體的方式將資料寫入磁碟。所以Redis具有快速和資料持久化的特徵;如果不將資料放在記憶體中,磁碟I/O速度將嚴重影響Redis的效能。
4、Redis事務
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發來的命令請求所打斷。
事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。
相關的命令有:MULTI、EXEC、DISCARD、WATCH ##28。
5、Redis管道
- 客戶端向服務端傳送一個查詢請求,並監聽socket返回,通常是以阻塞模式,等待服務端響應;
- 服務端處理命令,並將結果返回給客戶端;
Redis管道技術可以在服務端未響應時,客戶端可以繼續想伺服器端傳送請求,並最終一次性讀取所有服務端的響應。
6、Redis為什麼要做分割槽
分割槽可以讓Redis管理更大的記憶體,Redis可以使用所有機器的記憶體。
如果沒有分割槽,Redis最多使用一臺機器的記憶體。
分割槽使得Redis的計算能力通過簡單地增加計算機的數量得到成倍提升;Redis的網路頻寬也會隨著計算機和網絡卡的增加而成倍增長。
7、Redis分割槽方案
- 客戶端分割槽:在客戶端決定資料會被儲存到哪個Redis節點,或者從哪個Redis節點讀取。大多數客戶端已經實現了客戶端分割槽。
- 代理分割槽:客戶端將請求傳送給代理,由代理決定去哪個節點寫資料或者讀資料。代理根據分割槽規則決定請求哪些Redis例項,然後根據Redis的響應結果返回給客戶端。Redis和memcached的一種代理實現就是Twemproxy。
- 查詢路由(Query routing):客戶端隨機地請求任意一個Redis例項,由Redis將請求轉發給正確的Redis節點。
- Redis Cluster:實現了一種混合形式的查詢路由,但並不是直接將請求從一個Redis節點轉發到另一個Redis節點,而是在客戶端的幫助下直接redireced到正確的Redis節點。
8、Redis快取穿透
快取穿透是指查詢一個一定不存在的資料,由於快取不命中,接著查詢資料庫也無法查詢出結果,因此也不會寫入到快取中,這將會導致每個查詢都會去請求資料庫,造成快取穿透。
解決方案:
- 布隆過濾器:對所有可查詢的引數以hash形式儲存,在控制層先進性校驗,不符合規則丟棄,從而避免了對底層儲存系統的查詢壓力。
- 快取空物件:當儲存層不命中後,即使返回的空物件也將其快取起來,同時會設定一個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源。但是這種方法存在兩個問題:1)如果空值能被儲存起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多空值的鍵;2)即使對空值設定了過期時間,還是會存在快取層和儲存層的資料會有一段時間視窗的不一致,這對於需要保持一致性的業務會有影響。
這兩種方法的比較:
解決快取穿透 | 適用場景 | 維護成本 |
布隆過濾 | 1、 資料命中不高 2、資料頻繁變化,實時性高 | 1、程式碼維護複雜 2、快取空間佔用少 |
快取空物件 | 1、資料命中不高 2、資料頻繁變化,實時性高 | 1、程式碼維護簡單 2、需要過多的快取空間 3、資料不一致問題 |
9、Redis快取雪崩
快取雪崩是指,由於快取層承載著大量請求,有效的保護了儲存層,但是如果快取層由於某些原因整體不能提供服務,於是所有的請求都會到達儲存層,儲存層的呼叫量會暴增,造成儲存層也會掛掉(如快取層大量的key在同一時間過期,這樣大量key的請求就會直接訪問儲存層)
解決方案:
- 保證快取層高可用性:即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,比如Redis Sentinel和Redis Cluster都實現了高可用;
- 依賴隔離元件為後端限流並降級:在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待;
- 資料預熱:可以通過快取reload機制,預先去更新快取,在即將發生大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點儘量均勻。