技術和基礎設施→ 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)。
- 別名/令牌和短壽命授權緩存。
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矩陣(sec/min/hour),添加jitter (± 10-20%),以避免踩踏。
- 對於熱鍵-refresh-ahead和單飛(一個領導者更新)。
- 「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)。
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.
- 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,同時將關鍵不變量(金錢,會計)留給「真相來源」-因此平臺將保持快速和可靠。