REDIS
先看圖再說
Q:用文字拼圖給我看redis?
A: Redis 長得像什麼、能做什麼畫給你看(像一個超快的「記憶體寶箱」):
┌─────────────────────────┐
使用者/服務 ───────▶ │ Redis 伺服器 │ ◀─────── 其他服務
(API/網站/遊戲) └───────────┬─────────────┘
│
│ 存在「記憶體」裡,超級快
▼
┌───────────────────┐
│ 資料結構寶箱 │
│ ┌───────────────┐ │
│ │ String 字串 │ │ 一個鍵對一個值
│ ├───────────────┤ │
│ │ Hash 雜湊 │ │ 一個鍵對很多小欄位
│ ├───────────────┤ │
│ │ List 清單 │ │ 先進先出/後進先出
│ ├───────────────┤ │
│ │ Set 集合 │ │ 不重複的元素
│ ├───────────────┤ │
│ │ ZSet 排序集 │ │ 有分數的排行榜
│ └───────────────┘ │
└─────────┬─────────┘
│
┌─────────────────┼──────────────────┐
▼ ▼ ▼
┌────────────┐ ┌──────────────┐ ┌──────────────┐
│ 快取層 │ │ 訊息佇列/任務 │ │ 發佈/訂閱 │
│ (Cache) │ │ (Queue) │ │ (Pub/Sub) │
│ 常用資料快取│ │ 背景工作排隊 │ │ 即時通知聊天 │
└─────┬──────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
▼ ▼ ▼
減少慢查詢 依序處理任務 即時推播消息
│
▼
┌────────────────────┐
│ 分散式鎖/限流 │
│ (避免同時撞車) │
└─────────┬──────────┘
│
▼
┌────────────────────┐
│ 永久化/備援 │
│ RDB/AOF ↔ 磁碟 │ 斷電不怕全忘
│ 主從複製 叢集 │ 可擴充更穩
└────────────────────┘
簡單說:
Redis 把資料放在記憶體,所以速度像閃電。
它會用很多「積木」(資料結構) 讓你做快取、排隊、通知、排行榜。
還能把資料寫到硬碟、做主從、做叢集,讓它不容易壞、可以長大。
看完還是一點都沒有體感...
Q:不是已經有瀏覽器會暫存嗎?
A:
瀏覽器的「暫存」和 Redis 的「快取」聽起來很像,但它們其實是兩種不同的工具,用途也不一樣。
瀏覽器暫存 (Browser Cache)
誰在用?:只有你的電腦瀏覽器。
存什麼?:網頁的圖片、CSS、JavaScript、HTML。
目的是什麼?:讓你下次打開同一個網站,不用再從網路抓檔案,速度會比較快。
限制?:
只能幫單一使用者加速。
如果換電腦或清掉快取,資料就沒了。
不能當資料庫,無法給伺服器端程式存取。
Redis 快取 (Server Cache)
誰在用?:伺服器端程式(API、後端服務、遊戲伺服器)。
存什麼?:使用者登入狀態、排行榜、API 結果、統計數字…等等。
目的是什麼?:幫「整個系統」加速,不只是單一使用者。
優點?:
所有用戶端都可以共享同一份快取。
存取速度比硬碟快非常多。
資料結構多樣,可以做很多事(不像瀏覽器只能存檔案)。
簡單比喻:
瀏覽器暫存 → 自己小書桌,放課本,只有你能用。
Redis 快取 → 教室黑板,老師寫一次,全班都能一起看。
Q:我想知道有用 redis跟沒用 redis 在什麼情況下會有差異
A:
沒用 Redis 的情況
每次使用者要資料,伺服器都要去問資料庫(例如 PostgreSQL)。
資料庫雖然可靠,但查詢、計算、組裝的速度會比較慢,尤其當同時有很多人來問的時候。
結果就是:伺服器壓力大、回應慢、網站容易卡頓。
有用 Redis 的情況
第一次查資料時,後端會把結果放進 Redis。
下一次有人問一樣的東西,伺服器不用再去資料庫,直接從 Redis 的「記憶體快取」拿。
因為 Redis 在記憶體裡,速度幾乎是瞬間完成。
結果就是:伺服器壓力小、回應快、網站更流暢。
沒用 Redis
使用者 -> 後端伺服器 -> [慢] -> 資料庫 (每次都查)
有用 Redis
使用者 -> 後端伺服器 -> Redis (快取到就直接回)
│
▼
資料庫 (只有沒快取時才查)
實際差別
網站查詢次數很多時,Redis 可以大幅減少資料庫壓力。
即時性要求高(像遊戲排行榜、聊天室訊息),Redis 可以瞬間處理。
需要統計數字(例如同時上線人數),Redis 可以比資料庫更快計算。
要不要我幫你用「一個真實案例」說明?
例如:登入系統有沒有用 Redis 來存 Session,速度差在哪裡?
Q:太好了...難得有我看過的東西(session、登入系統..),給我看吧!
A:
[沒用 Redis 的登入系統]
使用者輸入帳號密碼。
後端伺服器去資料庫查這個人存不存在。
登入成功後,伺服器要一直去資料庫確認「這個人還在線嗎」。
問題:
每個動作都要問一次資料庫。
如果同時有很多人登入,資料庫會超級忙,變慢或塞爆。
ASCII 圖:
使用者 -> 後端 -> 資料庫 (查帳號)
使用者 -> 後端 -> 資料庫 (查密碼)
使用者 -> 後端 -> 資料庫 (查登入狀態)
[有用 Redis 的登入系統]
使用者輸入帳號密碼。
後端伺服器去資料庫查一次 → 登入成功。
把「登入狀態 (Session)」存進 Redis。
之後只要確認這個人是不是還在線,直接問 Redis 就好。
好處:
資料庫只在登入瞬間被查一次。
所有後續動作都超快,因為 Redis 是記憶體存取。
上萬人同時登入也比較撐得住。
ASCII 圖:
使用者 -> 後端 -> 資料庫 (只查一次)
│
▼
Redis (快取登入狀態)
使用者 -> 後端 -> Redis (超快確認)
業界實際用法
小範圍、單機:直接用 Python 變數,最省事。
多人、多機、跨伺服器:用 Redis,因為它能讓大家共用同一份資料,還保持速度快。
長期保存:用資料庫,因為 Redis 主要是快取,不適合放一輩子的資料。
到這邊為止,我對Redis到底可以幹嘛算是比較清楚了...
至於基於好奇心,又接著問他業界實際還會用到什麼.............就是另一個故事了。
我重點是要先讓這個專案可以跑起來阿!!