在使用 Redis 緩存 Java 對象時,若實體類新增字段而緩存中舊數據缺少該字段,反序列化會導致新字段為 null,進而引發空指針異常。本文提供一種基於版本號的 Key 設計策略,從根源上避免此類問題。
假設活動配置類 Activity 初始有 limit1、limit2 兩個布爾字段,緩存 Key 為 ACTIVITY_KEY。上線運行一段時間後,新增 limit3 字段。舊緩存反序列化時 limit3 為 null,若代碼中直接判斷 if (limit3) 則拋出 NullPointerException。
將實體類所有聲明字段的數量作為版本號納入 Key,字段變更自動導致 Key 變化,強制重新加載數據。
private static int version(Class> clazz) {
return clazz.getDeclaredFields().length;
}
// 緩存 Key 生成示例
String key = "ACTIVITY_KEY_" + version(Activity.class);
getDeclaredFields().length 返回值| 優點 | 缺點 |
|---|---|
| 徹底解決空指針風險 | 導致舊緩存失效,短期內增加資料庫壓力 |
| 無需維護額外版本配置 | 無法區分字段增減類型(如僅修改方法不影響) |
| 實現簡單,無第三方依賴 | 內部類、匿名類可能干擾字段計數 |
FAIL_ON_UNKNOWN_PROPERTIES = falseOptional 封裝