請問大家,在使用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擁有原...