Redis 常見問題及解決方案

2022-07-09 20:00:13 字數 2182 閱讀 1304

這類錯誤還是挺常見的,一般來說都屬於下面幾種情況之一:

一、沒有單例

當併發達到一定量級時候,如果沒有使用單例模式例項化,會引發此類錯誤致服務不可用。因為在高併發情況下沒有使用單例進行例項化,會導致連線池被大量建立,在業務不停止的情況下很容易發生來不及釋放的情況,最終導致阻塞。

private

idatabase db;

private

static connectionmultiplexer conn = null

;public

static

object locker = new

object

();public redis(int

i) }

}db =conn.getdatabase(i);

}

二、耗時過長的指令(stackexchange客戶端連線的唯讀屬性timeoutmilliseconds=1000),可以通過修改配置搞定:

var config = new

configurationoptions

;

三、clr中thread pool最小按需建立執行緒數過小導致的等待成本(500ms),可在program.cs設定最小執行緒數解決(數量要按實際情況設定,否則可能會影響效能):

public

class

program

}

建議設定的同時,把所有的redis操作更改成非同步操作。上面三種應用如果還是出現相同問題的話,推測是硬體問題了。但是概率非常小,目前還沒有遇到過。

當redis占用記憶體超過或持平了伺服器的記憶體上限,就會出現這個錯誤,新手尤其容易犯這類錯誤。正確的做法是設定快取上限,並且搭配記憶體**策略使用,下附常用**策略:

#設定最大快取,單位bytes,下面這條是設定最大快取1g

maxmemory

1073741824

#**策略

#預設,到達上限時丟擲異常

maxmemory-policy noeviction

#淘汰使用頻率最低的鍵,包括持久鍵

maxmemory-policy allkeys-lru

#淘汰使用頻率最低的鍵,不包括持久鍵

maxmemory-policy volatile-lru

#隨機淘汰,包括持久鍵

maxmemory-policy allkeys-random

#隨機淘汰,不包括持久鍵

maxmemory-policy volatile-random

#淘汰有過期時間的鍵,距離原本過期時間最近的優先

maxmemory-policy volatile-ttl

修改配置檔案後重啟服務即可。

如果你確認自己的redis服務正常的話,那麼相當大的概率是快取雪崩。

快取雪崩簡單來說就是大量快取同時過期,如果有幾個g或者更多的快取同時過期,而發生時又很不幸的是業務高峰期的話,你的資料庫大概率會掛掉,而且一旦掛掉,就沒那麼快恢復了。

解決方法很簡單:快取鍵設定隨機過期時間,避開批量過期就可以解決這個問題。

但如果已經隨機仍然頻發,那麼就要換個思路了:還有可能是快取擊穿。

什麼是快取擊穿呢?簡單來說就是某個被大量訪問的鍵忽然過期,從而導致資料庫壓力陡增。

針對擊穿的解決方法也不複雜:快取鍵過期時,先拿乙個互斥鎖再去資料庫拿資料,寫入快取以後釋放鎖;期間訪問同一鍵的其他程序設定延時訪問即可。

其他程序可以少次數迴圈取鍵,比如迴圈5次,每次100毫秒。迴圈完了還拿不到就先返回失敗。

這樣做不僅可以降低資料庫的壓力,同時也降低了redis的寫壓力;實際情況可以根據業務需要看著辦,並不是一定要這樣做。

快取服務如果沒有任何異常,那麼有可能是快取穿透。

什麼是快取穿透呢?簡單來說就是有人老是去請求不存在的資料。

那什麼是不存在的資料?假設資料庫中使用者id是從10000開始的,現在有人頻繁去請求使用者id為500的資料,這個id為500的資料就是不存在的資料。因為它不可能存在於資料庫。

這時候會怎麼樣呢?系統先查詢快取,查不到所以去查了資料庫,也沒有查到,所以直接返回空。但是下一次請求還是要走一遍快取+資料庫。這個時候只要一段簡單的指令碼就可以對資料庫造成壓力。

解決方法很簡單:當資料庫查不到資料時,先設定乙個null鍵入快取,之後就任他刷。一般情況下會給這個null值設定乙個過期時間。

redis快取常見問題及解決方案

快取雪崩 當快取伺服器重啟或者大量快取集中在某乙個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓 力。導致系統崩潰。解決方案 在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個線 程查詢資料和寫快取,其他執行緒等待。做二級快取,a1為原始快取,a2為拷貝...

Redis快取常見問題及解決方案

可以簡單的理解為 系統剛剛部署完畢,所有快取資料還未準備完畢或者由於原有快取有效期集體到達 例如 系統中所有快取都設定的一致的過期時間,在同一時刻出現大面積的快取過期,所以原本應該查詢快取的請求都去查詢資料庫了,造成資料庫壓力驟增,甚至宕機.使用加鎖或者佇列的方式保證不會有大量執行緒對資料庫進行一次...

Matrikon OPC常見問題及解決方案(一)

本文主要分享了使用matrikonopc伺服器時遇到的一些最常見的問題和相應的解決方案。在聯絡matrikonopc支援團隊之前,你可以看一下以下問題 解決方案和問題 答案部分是否能幫助你解決目前問題。安裝時出現 aprxdist 錯誤問題 安裝時出現的 aprxdist 錯誤是什麼?解決方案 以管...