首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Redis 存儲圖片方案對比:Base64/URL/路徑 vs 對象序列化深度解析

     編輯:DB2 教學

Redis 存儲圖片方案對比:Base64/URL/路徑 vs 對象序列化深度解析

方案一:Base64 字符串存儲

核心流程

  1. 下載圖片 → BufferedImage
  2. ImageIO.write 輸出到 ByteArrayOutputStream
  3. BASE64Encoder.encode() → String
  4. Redis SET key base64_string
  5. 讀取時 BASE64Decoder.decode() → 字節數組 → 寫文件/返回前端
public static String encodeImgageToBase64(URL imageUrl) { ... }
public static void decodeBase64ToImage(String base64, String path, String imgName) { ... }

Base64 編碼流程圖 控制台輸出 Base64 字符串 解碼後文件

優缺點

優點缺點
純文本,可直接嵌入 HTML/JSON (data:image/jpg;base64,...)體積膨脹 33%(Base64 編碼開銷)
無需額外存儲服務,數據自包含Redis 內存佔用大,大圖片極易撐爆內存
跨系統傳輸無編碼困擾獲取需完整解碼,不支持範圍讀取/流式傳輸

方案二:URL/本地路徑存儲(引用模式)

# 圖片存對象存儲 (S3/MinIO/OSS) 或 CDN
SET img:1001 "https://cdn.example.com/images/1001.jpg"
# 或本地路徑
SET img:1001 "/data/images/1001.jpg"
  • 優點:Redis 值極小、支持 CDN 加速、圖片獨立管理、支持範圍請求/斷點續傳。
  • 缺點:引入外部依賴、需保證存儲服務高可用、URL 失效需同步清理 Redis。

方案三:Java 對象序列化存儲

實現

public class Person implements Serializable { ... }

// 序列化工具
public static byte[] serialize(Object obj) { ... }
public static Object unserialize(byte[] bytes) { ... }

// Redis 存取
jedis.set("person:100".getBytes(), serialize(new Person(100, "zhangsan")));
Person p = (Person) unserialize(jedis.get("person:100".getBytes()));

運行結果 Redis 存儲二進制

優缺點

優點缺點
完整保留對象圖、類型信息、方法行為Java 專有,跨語言不可用(Python/Go 無法反序列化)
開發便利,直接操作對象序列化版本演進困難(serialVersionUID、字段增減)
支持任意複雜對象圖二進制不可讀、調試困難、內存碎片化

方案四:圖片二進制直接存儲(推薦大圖場景)

# 讀取文件字節數組
byte[] imgBytes = Files.readAllBytes(Paths.get("/path/img.jpg"));
# 存儲
jedis.set("img:1001".getBytes(), imgBytes);
# 讀取
byte[] data = jedis.get("img:1001".getBytes());
  • 無編碼開銷、體積最小、支持 GETRANGE 範圍讀取(大文件分片下載)。
  • Redis 4.0+ 支持 LFU/LRU 淘汰策略,配合 maxmemory 防止 OOM。

選型決策矩陣

場景推薦方案關鍵理由
小圖標/驗證碼/嵌入 HTMLBase64 字符串前端直用、無額外請求
業務圖片/用戶頭像/文檔對象存儲 + Redis 存 URLCDN 加速、存儲解耦、成本優
緩存熱點圖片二進制(毫秒級訪問)Redis 直接存字節數組極致性能、支持範圍讀取
複雜對象緩存(Java 單體)JSON 序列化跨語言、可讀、版本友好
內部 RPC 傳遞對象Protobuf/Kryo/FST高性能、Schema 演進、跨語言

核心建議

  1. 絕不在 Redis 存大圖片 Base64/序列化對象:內存成本極高、淘汰風險大、網絡傳輸慢。
  2. 圖片歸對象存儲/CDN,Redis 只存元數據/URL/縮略圖:架構清晰、擴展性強。
  3. 對象緩存優先 JSON (Jackson/Gson):可讀、跨語言、版本兼容性優於 Java 序列化。
  4. Redis 4.0+ 開啟 LFU 淘汰:maxmemory-policy allkeys-lfu,自動保護熱點數據。

「把對的數據放在對的存儲」是分布式系統設計的鐵律,Redis 作為高速緩存層,職責是「快」,而非「大而全」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved