在軟體工程領域,提升系統性能的一個重要方法就是利用「臨時儲存」來減少共用內容的重複呼叫。由於「臨時儲存」的形式多種多樣,這篇文章將介紹幾種主要的儲存方式。
Cache
Cache 簡介
Cache(快取、緩存)是一種提升系統效能的重要技術。其核心概念是將常用的資料或運算結果儲存在臨時儲存區(即快取區),以便未來需要時能更快速地取得,從而減少訪問原始數據源所需的時間和資源消耗。
一般來說,程式執行時會先檢查資料是否存在於快取中。如果資料存在,則直接從快取讀取;若不存在,則從較慢的儲存設備(如主記憶體或硬碟)讀取資料,並將其儲存至快取中,讓下次存取變得更快速。Cache 的種類
- CPU 快取:最典型的硬體快取,通常分為幾層(L1、L2、L3)。L1 快取離處理器最近,存取速度最快,容量最小;L2 快取稍微遠一點,速度較慢但容量較大;L3 快取則是共享快取,容量最大但速度較慢。
- 網頁快取:瀏覽器會將常用的網頁資源(如圖片、CSS、JavaScript 等)緩存在本地,這樣當用戶再次訪問同一頁面時,可以快速加載,而無需重新下載所有的資源。
- 資料庫快取:資料庫中常會使用快取來減少查詢延遲。舉例來說,將常見的查詢結果儲存在記憶體中,當再次執行相同查詢時,就可以直接從記憶體中讀取結果,而不必每次都重新查詢。
- API 快取:API 快取用於儲存來自外部服務的結果,避免每次都進行重複的網絡請求。這不僅能加快響應速度,還能減少外部服務的負擔。
Cache 的替換策略
當快取區域已滿時,需要選擇替換哪些資料。常見的替換策略包括:
- LRU(Least Recently Used):最久未使用的資料會被替換。
- LFU(Least Frequently Used):使用頻率最少的資料會被替換。
- FIFO(First In, First Out):最早進入快取的資料會被替換。
Redis
Redis 簡介
Redis(Remote Dictionary Server)是一個開源的、基於記憶體的資料庫,主要用於儲存和管理快取資料。Redis 支援多種數據結構,並且具備極高的讀寫速度,非常適合用於需要快速存取資料的應用場景。
Redis 特點
- 高效的記憶體數據儲存:Redis 將資料儲存在記憶體中,這使得其讀寫速度非常快。它可以輕鬆支持每秒數十萬甚至數百萬次的讀寫操作,是高效能、低延遲應用的理想選擇。
- 多樣化的數據結構:Redis 支援豐富的數據結構,這是它的一個顯著特點。與傳統的鍵值存儲系統不同,Redis 讓開發者能夠使用更靈活的資料模型來管理數據。例如,它支援字串、列表、集合、有序集合、哈希、位圖、超級日誌等。
- 持久化功能:儘管 Redis 是基於記憶體的資料庫,但它提供了多種持久化機制來保證數據的可靠性,這些機制包括:
- RDB(快照儲存):將數據在指定的時間間隔內進行快照,並儲存為磁碟上的檔案。
- AOF(追加文件):將每一個寫操作記錄到磁碟,確保數據的持久性。AOF 的恢復策略能夠保證數據不會丟失。
- 原子操作與事務支持:Redis 支援原子操作,確保操作過程中不會被中斷。它還提供批量執行多條命令的功能,確保操作的一致性。
- 高可用性與分佈式功能:Redis 透過主從複製(Replication)、哨兵模式(Sentinel)和集群模式(Cluster)來實現高可用性和分佈式部署,這些特性讓 Redis 在處理大規模數據或高流量場景中具備強大的可擴展性和可靠性。
- 主從複製:可以將資料從主節點複製到多個從節點,從而實現讀寫分離,提高性能。
- Redis 哨兵模式:提供監控、故障切換等功能,確保 Redis 服務的高可用性。
- Redis 集群模式:支持數據分片和水平擴展,允許在多個節點之間分配資料並進行負載均衡。
- 發布/訂閱(Pub/Sub):Redis 內建支持發布/訂閱模式,用戶可以發布消息,並讓其他用戶訂閱相應的消息頻道。這使得 Redis 不僅可以作為快取系統,還能實現消息隊列和實時通信功能。
- 簡單的 API 和廣泛的語言支持:Redis 提供簡單易用的命令行接口(CLI),並且支持多種程式語言的客戶端,包括 Python、Java、Node.js、Go、Ruby、C# 等。開發者可以輕鬆將 Redis 集成到各種應用中。
Session
Session 簡介
Session(會話)是一種用來儲存用戶在訪問 Web 應用程式期間的狀態的機制。由於 HTTP 協議本身是無狀態的,即每一次請求都是獨立的,無法記錄過去的請求資料,因此需要使用 Session 技術來保持用戶的狀態。例如,Session 可以用來保存用戶的登錄狀態、購物車內容或使用者偏好等。與快取不同,Session 通常會與特定的用戶綁定,並在整個會話期間保持有效。
Session 的特點
- 保持狀態:在 Web 應用中,Session 主要用來記錄和保持用戶的狀態資料(如登錄狀態、選擇的語言、個人資料等)。這樣,當用戶在不同頁面之間切換或發送多次請求時,伺服器可以識別是同一用戶,並保留先前的狀態。
- 儲存位置:Session 資料通常儲存在伺服器端,而非客戶端。這樣可以確保資料的安全性,並避免資料被用戶篡改。Session 通常會與一個獨特的識別碼(Session ID)相關聯。
- Session ID:為了讓伺服器能識別不同用戶的會話,每個用戶的 Session 都會分配一個唯一的識別符——Session ID。該 ID 通常會儲存在用戶的瀏覽器 Cookie 中,並在每次用戶發送請求時,瀏覽器會自動將 Session ID 附帶在請求中。伺服器根據該 ID 查找對應的 Session 資料。
Session 的工作流程
- 用戶請求開始:用戶首次訪問應用程式時,伺服器會創建一個新的 Session,並為其分配一個唯一的 Session ID。
- Session ID 儲存:伺服器將生成的 Session ID 通過 Cookie 發送至用戶的瀏覽器。此後每次用戶發送請求時,瀏覽器會自動附帶這個 Session ID,從而讓伺服器識別用戶的會話。
- 伺服器端儲存資料:伺服器會將用戶的狀態資料(如登錄信息、購物車內容等)儲存在伺服器端的 Session 區域。這些資料會根據 Session ID 進行持久化存儲,直到會話結束。
- 會話過期或終止:Session 會有一個設定的過期時間(如 30 分鐘或 1 小時),當 Session 過期或用戶登出時,伺服器會自動刪除對應的 Session 資料。