#redis

Pub/Sub:廣播,丟了就丟 PUBLISH news "…" channel: news(不留存) Sub 線上✓ 收到 Sub 線上✓ 收到 Sub 離線✗ 漏掉 沒人在聽 → 沒了・無持久・無重播・無 ack Stream:留著的 log,可重播 XADD stream * …(append) m1m2m3m4m5 舊 consumer另一個從這讀 訊息留著(可設 MAXLEN 上限) 可從任意位置重讀・離線再上線能補・有 group + ack

Pub/Sub vs Stream:Redis 版的訊息系統

· tech · 約 5 分鐘 · 📚 Redis 學習筆記 #12

Redis 也能當訊息系統,但它有兩套截然不同的東西,用錯就會莫名其妙掉訊息、或殺雞用牛刀:Pub/Sub(廣播,丟了就丟)和 Stream(留著的 log,像一台縮小版 Kafka)。這是整個 Re…

#redis#distributed-systems

逐條 N × RTT vs pipeline 1 × RTT ① 逐條:每條都等一個來回 clientserver 3 條 = 3 個來回 = 3 × RTT ② pipeline:打包成一個來回 clientserver cmd1 ; cmd2 ; cmd3 一次送 三個回應一起收 3 條 = 1 個來回 = 1 × RTT ✓

管線、交易與 Lua:省 RTT 與原子性

· tech · 約 4 分鐘 · 📚 Redis 學習筆記 #11

有三個東西常被混在一起,其實各解完全不同的問題:pipeline 解「網路來回太多」、MULTI/EXEC(交易)解「一組命令要一起執行不被插隊」、Lua 解「要原子、又要帶邏輯」。搞混它們,你會拿 …

#redis#distributed-systems

key 落哪台:CRC16 → 16384 slot → node key:「user:1000」 CRC16(key) % 16384= slot 5798 Node Aslot 0 – 5460(+ 一個 replica) Node B ✓slot 5461 – 109225798 在這 → 由 B 保管 Node Cslot 10923 – 16383(+ 一個 replica) 16384 個固定 slot 是「中間層」,node 只是認領一段 slot 所以搬資料 = 搬 slot;擴縮容乾淨可控,不必重算全部 key 的位置

Redis Cluster:16384 個 slot 怎麼分片與擴縮

· tech · 約 5 分鐘 · 📚 Redis 學習筆記 #10

單執行緒那篇說過,一台 Redis 的瓶頸是記憶體與網路。當一台裝不下、或流量頂到單機上限,就要把資料分片(sharding)到多台——這就是 Redis Cluster。但它的分片方式很有個性:不用…

#redis#distributed-systems

Sentinel 自動故障轉移的五步 ① 監控一直 ping master與 replica ② 主觀下線某個 Sentinel覺得沒回應(SDOWN) ③ 客觀下線過半同意「真掛了」(ODOWN) ④ 選出 Sentinel leader → 挑 replica 升主選一個最完整的 replica 升為新 master其餘 replica 改指向新 master ⑤ 通知客戶端新 master 位址 客戶端向Sentinel 問「現在誰是master?」

高可用:Sentinel 怎麼自動故障轉移

· tech · 約 5 分鐘 · 📚 Redis 學習筆記 #9

上一篇的主從複製給了你副本,但留了一個大洞:master 掛了,不會自動有人接手。 你得半夜爬起來,手動把某個 replica 升成 master、把其他 replica 改指向它、再叫所有客戶端換位…

#redis#high-availability

一個 master 寫,多個 replica 讀 應用程式寫走 master、讀走 replica Master讀寫・單一寫入點只有一個 Replica 1只讀 Replica 2只讀 非同步複製 讀流量分散到各 replica → 水平擴展讀

主從複製:讀寫分離與複製延遲的怪現象

· tech · 約 4 分鐘 · 📚 Redis 學習筆記 #8

一台 Redis 再快也有記憶體與流量的上限,而且它一掛,資料就懸在半空。走向高可用的第一塊地基,就是主從複製(replication):一個 master 負責寫、若干 replica 各複製一份、…

#redis#distributed-systems

取得鎖:一行原子命令 SET lock:res <token> NX PX 30000 NX只有 key 不存在才設→ 互斥 PX 30000自帶 30 秒 TTL→ 持有者掛了也自動釋放,不死鎖 <token>隨機值→ 標記「這把鎖是我的」 釋放鎖:要驗 owner(Lua,原子) if GET(key)==token then DEL(key)GET 與 DEL 必須原子 → 只刪自己的鎖 直接 DEL 不驗 token→ 誤刪別人續租的鎖 ✗

分散式鎖:從 SETNX 到 Redlock,與那場著名的爭議

· tech · 約 5 分鐘 · 📚 Redis 學習筆記 #7

多個行程、多台機器要搶同一個資源(同一時間只准一個人扣庫存、跑一個排程),就需要一把分散式鎖。Redis 因為快又原子,常被拿來當這把鎖。但這是個「看起來三行就能寫完、其實坑深到見底」的題目——一路踩…

#redis#distributed-systems

三種破口,長得不一樣 穿透 Penetration 查「不存在」的 key cache 沒有、DB 也沒有 → cache 永遠擋不住 每次都直達 DB 擊穿 Breakdown 單一熱 key ⏰ 剛過期 瞬間大量並行同時 miss → 全湧向 DB 重建 集中打一個點 雪崩 Avalanche 大量 key ⏰ 同時過期 (或 Redis 整個掛掉) → 大範圍 miss DB 崩 → 連鎖 共通:請求繞過 cache 打爆 DB;差別在破口—— 不存在的 key(穿透)· 一個熱點(擊穿)· 一大片(雪崩)

快取三大災難:穿透、擊穿、雪崩,與正確解法

· tech · 約 3 分鐘 · 📚 Redis 學習筆記 #6

把 Redis 當快取,最經典的模式是 cache-aside(旁路快取):讀取先查 cache,命中就回傳、沒命中(miss)才查資料庫,再把結果回填進 cache。平常運作得很好——直到某些情況下…

#redis#cache

記憶體為界:硬牆在 RAM(對照 Kafka 磁碟為王) fork headroom(持久化時可能翻倍)實體 RAM 頂 ↑ ← maxmemory 硬牆 可成長空間 已用資料(在記憶體) 資料在記憶體→ 容量硬上限 = RAM 撞牆 → evict或 noeviction 報錯 磁碟 RDB/AOF 重啟回暖 對照:Kafka 瓶頸=磁碟 throughput / 容量 · Redis 瓶頸=記憶體容量

Redis:記憶體為界的有狀態服務

· tech · 約 4 分鐘 · 📚 從 Infra 角度看資料工具 #4

第二個有狀態的重量級是 Redis,而它跟 上一篇的 Kafka 剛好是一組完美對照:Kafka 磁碟為王,Redis 記憶體為界。兩者都有狀態,但體檢表第②題「狀態放哪」的答案不同——一個在磁碟、一…

#infrastructure#redis

過期 key 怎麼被清:惰性 + 定期,兩管齊下 TTL 到期的 key仍佔著記憶體(還沒被清) ① 惰性刪除(被動)有人來 GET 它 →發現過期 → 當場刪、回 nil ② 定期刪除(主動)背景每秒抽樣 ~10 次 →從有 TTL 的隨機抽一批刪 所以「過期」≠「立刻釋放」——沒人碰、也還沒被抽到,它就先躺著

Redis 的過期與淘汰:TTL、惰性刪除與 maxmemory 政策

· tech · 約 4 分鐘 · 📚 Redis 學習筆記 #5

把 Redis 當快取,遲早會碰到兩個問題:設了 TTL 的 key 到期後怎麼被清掉? 以及 記憶體滿了會怎樣? 這兩件事常被混為一談,其實是兩回事——前者是過期(expiration):「這個 k…

#redis#cache

拍快照(RDB) vs 記流水帳(AOF) RDB 快照定時拍全景 丟失視窗 檔小、載入快、適合備份 ✓ | 兩次快照之間會丟(可能幾分鐘)✗ AOF 日誌每筆寫都記 更安全(最多丟一個 fsync 間隔)✓ | 檔大、載入慢(要重放)✗ 混合模式(Redis 4+):AOF 開頭放一個 RDB 快照 + 後面接增量命令 → 載入快又丟得少(現代推薦)

Redis 持久化:RDB 快照 vs AOF 日誌,資料到底會不會丟

· tech · 約 5 分鐘 · 📚 Redis 學習筆記 #4

「Redis 是記憶體資料庫,一斷電資料就全沒了」——這句話半對半錯。對的是它主要活在記憶體;錯的是它其實有持久化,能把資料寫到磁碟、重啟後還原。只是它的持久化語意比傳統資料庫弱,你得懂才用得對。Re…

#redis#persistence

單執行緒 + event loop:一條隊,一個一個處理 client client client client 上萬連線 epollI/O 多工一個執行緒盯全部 命令佇列(一條隊)cmd1cmd2cmd3 單執行緒執行逐一執行、每個原子無鎖、無 race Redis 6 的「多執行緒」只用在讀寫 socket 這些網路雜活—— 命令的「執行」仍是單執行緒,所以原子性、免鎖的好處通通不變

Redis 單執行緒為什麼反而快?——以及 O(N) 命令的地雷

· tech · 約 4 分鐘 · 📚 Redis 學習筆記 #3

第一篇說 Redis 快的原因之一是「單執行緒 + 免鎖」。這聽起來很反直覺——單執行緒不是慢嗎? 這篇就把這件事講透:為什麼單執行緒反而快、它換來什麼,以及它一體兩面的代價——一個慢命令會卡住所有人…

#redis#performance

五大核心結構:選對一個,問題解一半 Stringbytes / 數字 42 快取 · 計數器(INCR)· 分散式鎖(SET NX) List有序,兩端進出 佇列(LPUSH / RPOP)· 最新 N 筆(LPUSH+LTRIM) Hashfield → value name: Aidanage: 30 存物件 · 只改一個欄位,免整包搬進搬出 Set無序、自動去重 去重 · 標籤 · 交集(共同好友 SINTER) Sorted Set成員帶 score、自動排序 a:1b:2c:3 排行榜 · 範圍查詢 · 延遲佇列(score=時間)

Redis 的靈魂:五大資料結構 + 進階武器

· tech · 約 4 分鐘 · 📚 Redis 學習筆記 #2

上一篇說 Redis 的靈魂是「資料結構」——那這篇就把工具箱打開。Redis 用得好不好,九成看你會不會選對結構:選對了,一個排行榜三行命令搞定;選錯了,你會用一堆 GET/SET 在應用端硬幹本來…

#redis#data-structures

傳統 KV 快取(memcached) key → 「一坨字串」(不透明 blob) 改一個欄位 = GET 整包 → 應用端改 → SET 整包 Redis(資料結構伺服器) key → List / Hash / Set / ZSet 伺服器端直接操作(原子)= HSET · LPUSH · ZADD · ZRANGE 例:排行榜 = 一個 Sorted Set,ZADD 記分 + ZRANGE 取前 N 不必把整個榜撈回應用端自己排序——運算搬到資料旁邊做,又快又原子

Redis 是什麼:不只是快取,是記憶體資料結構伺服器

· tech · 約 5 分鐘 · 📚 Redis 學習筆記 #1

大多數人第一次認識 Redis,都是把它當「快取」——把資料庫查詢的結果丟進去、下次直接拿。這沒錯,但也把它看小了。Redis 的本質是一台記憶體資料結構伺服器(in-memory data stru…

#redis#concept