什麼是 Redis?
Redis(Remote Dictionary Server)是一個開源的高效能記憶體鍵值資料庫,由 Salvatore Sanfilippo 開發,2009 年首次發布。它不只是簡單的鍵值儲存,還支援多種資料結構:字串、雜湊、串列、集合、有序集合等。
Redis 的主要特點
- 高效能:資料全存在記憶體,讀寫速度極快。
- 持久化:雖然是記憶體資料庫,仍提供 RDB 快照與 AOF 兩種持久化選項。
- 多種資料結構:字串、雜湊、串列、集合、有序集合,針對不同場景各有用途。
- 原子性操作:所有命令(包括操作複雜資料結構的命令)都是原子性的。
- 發布/訂閱:內建 Pub/Sub,可直接用於訊息傳遞。
- 事務支援:以
MULTI/EXEC包裹一批命令一次執行。
Redis 的使用場景
1. 快取
最普遍的用途。把頻繁讀取的資料放進 Redis,下次請求直接從記憶體拿,不用打資料庫。
實例:電商商品頁面,使用者瀏覽時先查 Redis;命中就直接回傳,沒命中才去查 SQL Server 並把結果寫回 Redis。
2. 會話儲存
登入狀態、購物車這類短期會話資料,放 Redis 比放關聯式資料庫省事——TTL 到期自動清除,不用另外寫排程。
實例:Web 應用的使用者會話,每次請求從 Redis 讀取並更新,免去對主資料庫的多餘查詢。
3. 即時分析
計數、累加這類高頻寫入,Redis 的 INCR/INCRBY 是原子操作,不需要加鎖。
實例:社群平台追蹤熱門話題,每次有新貼文或互動就更新對應計數器,即時反映趨勢。
4. 排行榜
有序集合(Sorted Set)原生支援按分數排序,ZRANGEBYSCORE、ZRANK 直接用。
實例:線上遊戲的玩家積分排行,存進有序集合後,前 N 名或單一玩家排名都是 O(log N) 取得。
5. 訊息佇列
串列的 LPUSH/BRPOP 可以當輕量佇列——生產者推、消費者阻塞等待,不需要額外的 MQ 元件。
實例:非同步任務系統把工作推進 Redis 串列,工作程式逐一取出處理。
6. 地理空間資料
Redis 3.2 引入 GEO 命令,可以儲存座標並以距離查詢附近的點。
實例:叫車應用把司機即時位置存進 Redis,搜尋使用者附近的可用司機時直接用 GEORADIUS。
Redis 與 SQL Server 搭配
同時用 Redis 和 SQL Server 是常見的混合架構——SQL Server 負責結構化資料與複雜查詢,Redis 負責高頻讀取與即時狀態。兩者職責不同,不是互相取代。
常見分工方式
快取層:主資料留在 SQL Server,熱資料快取進 Redis。讀取量大的查詢不再每次打資料庫,SQL Server 的 I/O 壓力明顯下降。
會話管理:使用者帳號資料在 SQL Server,登入狀態和 token 放 Redis。登入驗證只打 Redis,速度快且 TTL 到期自動失效。
即時統計:歷史資料在 SQL Server,當天或近期的累計數字(瀏覽數、點擊數)在 Redis 即時更新,定期或觸發時再寫回 SQL Server。
任務佇列:任務詳情存 SQL Server,待處理佇列用 Redis 串列,工作程式從 Redis 拿任務、處理完後更新 SQL Server 狀態。
幾個要注意的地方
- 資料一致性:快取和主資料庫之間的同步策略(Cache-Aside、Write-Through、Write-Behind)要在設計階段就想清楚,上線後補救麻煩。
- 記憶體用量:Redis 的資料全在記憶體,什麼資料值得快取、TTL 怎麼設,需要根據實際存取模式決定,不是把所有東西都丟進去。
- 複雜度:多了一層快取就多了一層要維運的元件,監控、驅逐策略、失效重建的邏輯都要到位。




