Logo GH

技術和基礎設施→ Redis:記憶解決方案

Redis: 內存解決方案

1) Redis在哪裏

Redis是具有豐富數據結構的高速內存存儲密鑰值。典型的腳本是:
  • Kesh(read-through/aside,TTL,SWR)和會議。
  • 計數器和配額:限額限制,反限額,競選限額。
  • 領導板/排名(ZSet),「top N」建議。
  • 活動隊列/總線(Streams/PubSub)、outbox/inbox、retrai。
  • 相等性(帶有TTL的鍵),de-dup webhook。
  • Geo(查找最近的點),Bitmap(標誌,DAU)。
  • 別名/令牌和短壽命授權緩存。
💡 重要信息:對於現金余額和關鍵不變量,Redis僅用作讀取加速器或DBMS/ledger中具有「真值源」的日誌/緩存。

2)數據結構及其應用時間

字符串:值/計數器(「INCRBY」),等效鍵。
Hash:配置文件/組合,存儲「輕量級」對象。
List:簡單的隊列(但沒有replay/offset語義)。
集合:獨特的元素,重復數據消除。
ZSet: skor排序(領導板、TTL日歷-「延遲」事件)。

Stream: 與消費者群體的穩定隊列,「XREADGROUP」/replay-用於webhook, CDC, retraes.

Geo:「GEOADD/GEORADIUS」是最近的點/商號。
Bitmap/Bitfield:標誌系列(日誌,DAU/WAU)。
HyperLogLog:大致唯一的(UU)內存便宜。
Bloom/Cuckoo(模塊):快速可用性檢查,減少「MISS」到源。

模塊:
  • RedisJSON(JSON文檔),RediSearch(索引/搜索),RedisBloom(概率結構),TimeSeries(度量/聚合)。

3)密鑰、TTL和內存策略

Neiming和細分:

tenant:{t}:domain:{d}:{entity}:{id}:v{schema}    region={R}    currency={C}    lang={L}

Version(「vN」),僅包括有意義的測量(區域/貨幣/語言/Tenant)。
隔離按鍵空間。

TTL和「新鮮」:
  • 使用TTL矩陣(sec/min/hour),添加jitter (± 10-20%),以避免踩踏。
  • 對於熱鍵-refresh-ahead和單飛(一個領導者更新)。
置換策略(maxmemory-policy):
  • 「allkeys-lru/lfu」是沒有TTL依賴性的常見凱什。
  • 「volatile-lru/lfu」僅是TTL的密鑰。
  • 「noeviction」-溢出時寫入失敗(對於關鍵隊列/計數器更安全)。
  • 選擇腳本並始終監視「evicted_keys」。

4)交易、管道和腳本

Piplines:降低RTT,分組10-100個命令。
事務(MULTI/EXEC):不隔離讀取,但原子執行數據包。
Optimistic locking: 「WATCH key」 → 「MULTI/EXEC」 →驗證。
Lua腳本:服務器端原子邏輯(rate limit, locks, composite operation)。

💡 對於單節點Redis Lua腳本;在Cluster中-確保所有密鑰都位於單個哈希插槽中(哈希標簽「{……}」)。

5)隊列和總線: List vs Stream

List+「BRPOP」-簡單但沒有消費者組,offset/replay,對跌倒的抵抗力較弱。
流:「XADD → XREADGROUP → XACK」,retry-deadletter(在N分鐘內逆轉),按鍵分期。建議用於PSP/KYC網絡手冊、遞延付款/通知。

優先排隊:按優先次序排列幾個流,消費者首先「吸入」高位。
延遲任務:ZSet在哪裏score=timestamp;定期「ZRANGEBYSCORE」 ≤現在→轉移到Stream。

6)高可用性和擴展

復制:master→replica(read-scale)。

Sentinel: 自動失效主機,檢測,客戶端URI.

Redis Cluster:在16384插槽上打滑,水平尺度。使用多個結構的密鑰包裹在哈希標簽「{order: 123}」中。

模式是:
  • 對於kesha/會話, 「client-side hashing」支持SDK。
  • 對於隊列/流-最大限度地減少跨段操作;按域密鑰參與。

7)持續性: RDB,AOF和備用

RDB(快照):更快、更經濟;最後幾秒鐘/分鐘丟失的風險。
AOF(期刊):損失減少;「everysec/always」模式。AOF壓縮和周期性重新包裝。
混合體:RDB+AOF →快速恢復+中等損失。
Backaps:napshots和AOF到對象存儲的副本;定期檢查恢復情況。

對於關鍵隊列/冪等,選擇AOF 'everysec'+復制。

8)安全和合規性

AUTH/ACL:按應用程序角色,禁止「危險」命令(「FLUSHALL」,「KEYS」)。
TLS到客戶端-服務器和節點間鏈接;固定的egress-IP。
網絡細分:私有子網,SG/NACL;僅可從所需服務/neyspace訪問。
不要編造秘密;Redis中的PAN/PII僅是令牌/衍生品。
密鑰命令:避免「KEYS」-使用「SCAN」。

9)可觀察性和SLO

關鍵指標:
  • Latency (P95/P99), `instantaneous_ops_per_sec`, `connected_clients`.
  • Hit ratio, evicted_keys, expired_keys.
  • Memory: used, fragmentation ratio, RSS, allocator stats.
  • Replication lag,AOF/RDB頻率和尺寸,分叉時間。
  • Streams: PEL (pending entries list), delivery latency, retry count.
SLO示例:
  • Redis P 99 ≤ 5-10毫秒操作。
  • Evictions ≤ 1%/小時 (kesh空間)。
  • Stream delivery P99 ≤ 500 мс, retry rate < 2%.

10) FinOps和資源規劃

記憶路:測量$/GB-mes RAM vs 節省起源/DB請求。
啟用>1-2 KB值壓縮(請參閱CPU)。
LFU可以以較小的體積提供更好的命中率。
對於圖像/大斑點-不是Redis:使用CDN+對象存儲。

11) iGaming/fintech的模式

11.1級限制(滑動窗口,Lua)

想法:「INCRBY」在+TTL窗口中;盧阿原子檢查極限並放大。

lua
-- KEYS[1]=key ARGV[1]=limit ARGV[2]=ttlSec ARGV[3]=inc local cur = redis. call('INCRBY', KEYS[1], ARGV[3])
if cur == tonumber(ARGV[3]) then redis. call('EXPIRE', KEYS[1], ARGV[2]) end if cur > tonumber(ARGV[1]) then return {0, cur} else return {1, cur} end

11.2請求的難度

鍵:{request_id} with TTL 24 h,值是結果/狀態。在執行操作之前-我們檢查是否存在。

11.3個領導板

`ZINCRBY leaderboard:game:{g} score user:{u}` → `ZREVRANGE...WITHSCORES`.

對於區域/tenant的前N,是單獨的ZSet或前綴。

11.4 PSP webhook隊列

「XADD psp:webhooks……」 →消費者團體「XGROUP CREATE psp:webhooks g1$」。
通過PEL掃描(「XPENDING」 → 「XCLAIM」)轉發「掛起」消息。

11.5遞延付款

ZSet 「payout: due」 (score=epoch) → worker定期將現成的元素轉移到具有重復數據消除功能的Stream 「payout: exec」中。

11.6 Antifrod計數器

「PFADD」(獨特)+「INCR」(強度)+地理/ASN標簽的組合;手動檢查觸發器。

12)處理內存和性能

客戶連接池;減少RTT(保持活力)。
在團隊中更喜歡吹笛。
留意大鑰匙(「MEMORY USAGE」,「SCAN」)-最好粉碎對象。
具有少量字段的Hash比許多單個密鑰更經濟。
如果profit已通過測試確認,則啟用io-threads (read-heavy)。
避免在銷售中頻繁出現「FLUSHDB/ALL」;通過前綴和「UNLINK」進行管理,以便安全刪除。

13) Multi-tenant和隔離

單獨的群集/實例或logical DB per-tenant(如果負載較小)。
按鍵/內存配額,分開ACL。
按鍵中的前綴和namespace上的度量標準。

14)鎖定和一致性

SET key val NX PX=ttl是一個簡單的mutex。
Redlock:整齊使用;對於分布式關鍵交易,最好依靠「真相來源」(DB/ledger)和偶數操作。
更喜歡原子操作和Lua而不是「長期」鎖定。

15)反模式

大斑點/圖像存儲是RAM和網絡的過熱。
僅在Redis中金融不變量(資產負債表)。
「KEYS」和「世界掃描」在銷售中。
TTL/jitter的缺失是dogpile到期。
關鍵隊列上的「allkeys-」政策→壓力下的數據丟失。
在沒有配額和優先事項的情況下,將隊列、腰果和會議混為一談。
在Cluster中運行不同插槽密鑰的Lua腳本。

16)實施支票

1.定義角色:kesh/會話、隊列/流、計數器/限制-按實例/群集排列。
2.在任務下選擇maxmemory-policy;設置限值和監視事件。
3.鍵鍵,方案版本,TTL矩陣+jitter;單飛頂級鑰匙。
4.對於隊列-Streams(組、轉發、DLQ),對於延遲的-ZSet+遷移。
5.HA:復制+Sentinel或Redis Cluster;檢查客戶的失敗。
6.持續性:腳本下的RDB/AOF;定期備份和恢復測試。
7.安全性:ACL,TLS,私人網絡,禁止危險命令。
8.可觀察性:latency,ops/sec,memory,evictions,repliclag,stream PEL。
9.FinOps:內存配置文件,大密鑰,壓縮,LFU;避免大斑點的redis。
10.模式文檔(極限,等效性,領導板)和負載測試。

結果

Redis是速度的「多功能瑞士刀」:凱什,隊列,計數器,領導板,地質和概率結構。它的力量在於正確選擇數據結構,TTL/致殘學科,操作原子性,以及精心設計的NA/持久性和可觀察性。在毫秒和高RPS很重要的地方使用Redis,同時將關鍵不變量(金錢,會計)留給「真相來源」-因此平臺將保持快速和可靠。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

Telegram
@Gamble_GC
開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。