共用方式為


針對 Azure Cache for Redis 中的資料遺失問題進行疑難排解

本文討論如何診斷 Azure Cache for Redis 中發生的 部分完整 數據遺失。

這很重要

Azure Cache for Redis 宣布了所有 SKU 的淘汰時間表。 建議您儘快將現有的 Azure Cache for Redis 執行個體移至 Azure 受控 Redis

有關退役的更詳細資訊:

部分金鑰遺失

Azure Cache for Redis 不會在儲存在記憶體中之後隨機刪除密鑰,但會移除密鑰以回應到期原則、收回原則和明確的密鑰刪除命令。 您可以在 主控台 或透過 Redis CLI 執行這些命令。

寫入進階或標準 Azure Redis 實例中主要節點的密鑰可能無法立即在複本上使用。 數據會以異步和非封鎖方式從主要複本複寫到複本。

如果某些金鑰從快取中消失,請檢查下列可能的原因:

原因 描述
金鑰到期日 由於其設定的逾時,金鑰已被移除。
金鑰收回 金鑰在記憶體壓力下被移除。
金鑰刪除 透過明確的刪除命令移除了金鑰。
非同步複寫 復本上沒有金鑰,因為數據復寫延遲。

金鑰到期日

當密鑰被設定了逾時且該時間已過期時,Azure Cache for Redis 會自動移除該密鑰。 如需 Redis 金鑰到期的詳細資訊,請參閱 Redis EXPIRE 命令檔。 您也可以使用 SETSETEXGETSET 和其他 *STORE 命令來設定逾時值。

若要取得有多少金鑰已過期的統計數據,請使用 INFO 命令。 Stats 區段會顯示到期金鑰的總數。 Keyspace 區段會提供有關具有逾時設定的金鑰數量,以及平均逾時值的更多資訊。

# Stats

expired_keys:46583

# Keyspace

db0:keys=3450,expires=2,avg_ttl=91861015336

金鑰收回

Azure Cache for Redis 需要記憶體空間來儲存數據,並清除密鑰以在必要時釋放可用的記憶體。 當 used_memoryused_memory_rss 值接近設定 maxmemory 時,Azure Redis 會根據 快取原則 開始從記憶體收回密鑰。

您可以使用 INFO 命令來監視收回的金鑰數目。

# Stats

evicted_keys:13224

金鑰刪除

Redis 用戶端可以發出 Redis DELHDEL 命令,以明確地從 Azure Redis 移除密鑰。 您可以使用 INFO 命令,追蹤刪除作業的數目。 如果呼叫了 DELHDEL 命令,則會列在 Commandstats 區段中。

# Commandstats

cmdstat_del:calls=2,usec=90,usec_per_call=45.00

cmdstat_hdel:calls=1,usec=47,usec_per_call=47.00

非同步複寫

標準或高級層級的 Azure Cache for Redis 實例配置為一個主要節點和至少一個複本。 系統會使用背景流程,以非同步方式,將資料從主要節點複製到複本。

Redis 網站上的 Redis 複製 描述 Redis 資料複製的運作方式。 針對客戶端經常寫入 Redis 的案例,可能會發生部分數據遺失,因為複寫並非設計成即時。

例如,如果主伺服器在用戶端寫入密鑰後失效,但在背景程序有機會將該密鑰傳送至複本之前,當複本升格為新主伺服器時,密鑰就會遺失。

金鑰完全遺失

如果大部分或所有金鑰都從快取中消失,請檢查下列可能的原因:

原因 描述
金鑰排清 已手動清除金鑰。
不正確的資料庫選擇 Azure Redis 設定為使用非預設資料庫。
Redis 執行個體失敗 Redis 伺服器無法使用。

金鑰排清

Azure Redis 用戶端可以呼叫 Redis FLUSHDB 命令來移除單一資料庫中的所有密鑰或 FLUSHALL ,以從 Redis 快取中的所有資料庫移除所有金鑰。 若要了解是否已清除金鑰,請使用 [INFO] 命令。 Commandstats 段落顯示是否已呼叫 FLUSH 命令中的任一一個。

# Commandstats

cmdstat_flushall:calls=2,usec=112,usec_per_call=56.00

cmdstat_flushdb:calls=1,usec=110,usec_per_call=52.00

不正確的資料庫選擇

每個資料庫在邏輯方面是獨立的單位,並擁有不同的資料集。 Azure Cache for Redis 預設會使用 db0 資料庫。 如果您切換至另一個資料庫,例如 db1 並嘗試從中讀取密鑰,Azure Redis 就不會找到它們。 使用 Redis SELECT 命令來尋找其他可用資料庫中的索引鍵。

Redis 執行個體失敗

Redis 會在裝載 Redis 快取的實體或虛擬機 (VM) 上將數據保留在記憶體中。 基本層 Azure Cache for Redis 實例只會在單一虛擬機器 (VM) 上執行。 如果該 VM 關閉,您儲存在快取中的所有資料都會遺失。

標準層和進階層中的快取,會使用複寫設定中的兩個 VM,針對資料遺失情形提供更高的復原能力。 當這類快取中的主要節點失敗時,複本節點會接管以自動提供資料。

這些 VM 位於不同的網域中,以進行錯誤和更新,以將這兩部 VM 一次無法使用的機會降到最低。 不過,如果發生重大數據中心中斷,這兩個 VM 可能會關閉。 在這些罕見的情況下,您的數據會遺失。 請考慮使用 數據持久性異地複製 來提高針對基礎結構故障的數據保護。