Redis(六)之問題與解決

2021-09-26 07:29:06 字數 1679 閱讀 3847

請問大家,在使用redis的過程中有沒有遇到過什麼問題呢?比如快取雪崩,快取穿透,阻塞等。這些問題的產生原因是什麼呢?又該怎麼解決呢?本篇文章就說說這個。

因為redis是單執行緒架構,所有的讀寫操作都是在一條主線程中完成的,所以一旦出現阻塞,將是致命的。

(1)api或資料結構使用不合理

// 獲取最近的10條慢查詢

slowlog get 10

(1)cpu競爭

(2)記憶體交換

(3)網路問題:連線拒絕、網路延遲、網絡卡軟中斷

(1)在應用方加入異常監控,並要定位到具體的出問題的結點

(2)redis的監控

redis中的資料通常都是有生命週期的,需要在特定時間後被刪除或更新,這樣可以保證快取空間在乙個可控的範圍。有3種快取更新策略。

當快取使用量超過了預設的最大值時,會啟動策略對資料進行清除。

lru:最近最久未使用

lfu:最近最少使用

fifo:先進先出

在將資料放入快取時,已經設定了過期時間,當到時間後,自動將其刪除。使用命令expire來實現。

對資料進行「增刪改」操作後,立即清除redis中的相關資料

快取穿透是指查詢乙個資料庫不存在的資料,每次都去查詢資料庫,而每次查詢都是空,每次又都不會進行快取。假如有大量請求進來,可能會壓垮資料庫。

(1)自身業務**或者資料出現問題

(2)一些惡意攻擊,爬蟲等造成大量空命中

當資料庫不命中後,仍然將空物件保留到快取層中,之後再訪問這個資料,將會從快取中獲取,這樣就保護了後端資料來源。

實現**如下:

string get(string key)

return storagevalue;

}else

}

此解決辦法的使用場景為:資料命中不高且資料頻繁變化實時性高。

將存在的key放入布隆過濾器中。當乙個查詢請求過來時,先經過此過濾器,如果此過濾器認為該資料不存在,就直接丟棄,不再繼續訪問快取層和儲存層。

此解決辦法的適用場景為:資料命中不高,資料相對固定、實時性低

為了滿足業務需求,大量新增redis集群的節點,但是效能沒提公升反而下降。

在單機操作中,如果想批量獲取多個key,只需一次網路操作即可,在集群中,節點越多,涉及的網路io就越多,效能就可以能會下降。

(1)序列命令

(2)序列io

(3)並行io

(4)hash_tag實現

快取雪崩是指在設定快取時採用了相同的過期時間,導致快取在某一時刻同時失效,導致所有的查詢都落在資料庫上,造成了快取雪崩。

(1)不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。

(2)如果快取資料庫是分布式部署,將熱點資料均勻分布在不同的快取資料庫中。

(3)設定熱點資料永遠不過期。

(4)做二級快取。

(5)在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。

Redis筆記六之管道

redis中乙個操作命令就是客戶端和服務端的一次互動,如果有1000條set命令則意味著客戶端和服務端會有1000次互動,這顯然在效能上不符合我們的期望。redis提供管道機制來解決這一問題,使用管道會將1000條命令一次性發給伺服器然後再一次性全部執行,管道就是執行了乙個批處理操作。下面兩個例子分...

redis之六整數集合

整數集合 intset 是redis用於儲存整數值的集合抽象的資料結構,intset中不會存在重複的數字。1 contents陣列是整個集合的底層實現,整數集合每個元素都是contents陣列的乙個陣列項 item 各個項在陣列中按值的大小從小到大有序地排列,並且陣列中不包含任何重複項。2 leng...

redis解決併發問題

用redis處理高併發是個很常見的方式,因為redis的訪問效率很高 直接訪問記憶體 一般我們會用來處理 一瞬間的併發量。那如果要使用redis來進行高併發問題的解決的話,應注意以下幾點 1 首先我們要先知道,我們在儲存時,應使用redis的setnx方法,不應該使用set方法,因為setnx擁有原...