腰带体系结构:Redis,Memcached
腰带体系结构: Redis,Memcached
1) kesh的时间和原因
目标:降低潜伏期,卸载DB/PSP/外部 API,软化峰值。
腰果层通常是多层的:进程(L1)→服务级别(Redis/Memcached L2)→ 边缘/CDN。内部kesh加速了"热"阅读,L2(服务共享)和edge(公共内容)。
2)Redis vs Memcached-简述
规则:如果需要复杂的数据结构,持久性,pub/sub/stream/script-采取Redis。如果超简单,快速,便宜的KV-kesh层没有可重复性-Memcached。
3)积压模板
3.1 Cache-aside (lazy)
该应用程序从kesh →错误中读取→从DB读取→与TTL一起放入kesh。
TTL的简单控制,独立于腰果。−错过时可能会出现"风暴"。
3.2 Read-through
客户端/代理本身会在错过时从起源中拉出,然后放入kesh中。
集中逻辑.−更复杂的基础架构。
3.3 Write-through / Write-behind
写作:首先在kesh中录制,然后在DB中录制。
写在后面:写入队列,异步flash到DB(潜在的崩溃损失-需要日志)。
3.4 Two-tier (L1+L2)
L1(过程)具有短TTL和软TTL,L2(Redis/Memcached)是"腰果真相"。通过pub/sub致残。
4)TTL,风暴和一致性
TTL:设置接近数据更改频率。对于热键,请使用TTL(jitter)随机:'ttl=base ± rand(0.. base0。1)'-消除同步过期。
Dogpile (thundering herd):保护失误:- Singleflight:只有一个过程会重新生成值(请参见Lua示例)。
- Soft-TTL+background refresh:在"soft_ttl"之后放弃过时的(stale)并更新背景。
- Semaphore/lock: `SET key:lock value NX PX=2000`.
- Near-stale:答桉的API的"stale-while-revalidate"(见第8节)。
5)键,neyspaces,序列化
5.1键命名
Template: {domain}:{entity}:{id}:{field}
示例:- `user:profile:42` `catalog:product:1001:v2` `psp:rates:2025-11-03`
添加方案版本(':v2')-这有助于大规模残疾。
5.2 Nijspeiss通过"空间版本"
保持钥匙'ns: catalog=17'。Real keys: 'catalog: 17: product: 1001'。对于全球目录失效,只需内置"ns: catalog"。
5.3序列化/加压
JSON很舒服,但很沉重。使用MessagePack/CBOR。
包括用于大型付费的压缩(LZ4/ZSTD)(>1-2 KB)。在Redis-客户端。
6)热键和碎片
热键:通过hit/miss/byte监视top-N。对于极端热键:- Replicated read pattern:将值复制到多个shard键中"hot: k:1.. N",在阅读时选择随机值。
- Local L1:使用残疾订阅保存过程内存。
- Redis Cluster是本机的(16384 hash插槽)。
- Memcached是客户端一致哈希。
- Redis中的hash-tag"{……}'捕获键集的插槽:'user: {42}:profile'和'user: {42}:limits'将处于同一阶段。
7)排挤政策和规模
Redis `maxmemory-policy`: `allkeys-lru`, `volatile-lru`, `allkeys-lfu`, `noeviction` и т. д.对于腰果,通常是"allkeys-lru"/"allkeys-lfu"。
Memcached — LRU на item-slab.
密钥大小和价值:请注意最大小尺寸(Memcached默认值为1 MB,调音板)。
内存过多应该可以预见地降解:在活动路径上不是"未实现"。
maxmemory 32gb maxmemory-policy allkeys-lfu hz 50 tcp-keepalive 60
8)防暴模式-代码
8.1 Redis Lua singleflight(伪)
lua
-- KEYS[1] = data_key, KEYS[2] = lock_key
-- ARGV[1] = now_ms, ARGV[2] = soft_ttl_ms, ARGV[3] = hard_ttl_ms, ARGV[4] = lock_ttl_ms local payload = redis. call("GET", KEYS[1])
if payload then local meta = redis. call("HGETALL", KEYS[1].. ":meta")
local last = tonumber(meta[2] or "0")
if tonumber(ARGV[1]) - last < tonumber(ARGV[2]) then return { "HIT", payload }
end if redis. call ("SET," KEYS [2], "1," "NX," "PX," ARGV [4]) then return {"REFRESH," payload} - one worker updates, the rest give stale end return {"STALE," payload}
end if redis. call("SET", KEYS[2], "1", "NX", "PX", ARGV[4]) then return { "MISS", nil }
end return { "BUSY", nil }
8.2 Node.js cache-aside(简化)
js const v = await redis. get(key);
if (v) return decode(v);
const lock = await redis. setNX(key+":lock", "1", { PX: 1500 });
if (lock) {
const fresh = await loadFromDB(id);
await redis. set(key, encode(fresh), { EX: ttl, NX: false });
await redis. del(key+":lock");
return fresh;
} else {
await sleep(60); // short backoff const retry = await redis. get (key) ;//give someone's already filled return decode (retry);
}
9)残疾与连贯性
根据事件:如果更改为DB,则发布'pub/sub'事件'invalidate: {ns}:{id} '→订户删除密钥。
按计时器:用于频繁变化的数据的短TTL。
转化:参见'ns: 'keys。
Outbox:残障送货保证(活动log/topic, retrai)。
腰果操作的相等性:使用"SETXX/SETNX",版本("etag")和哈希字段进行填充。
10)复制,群集,failover
10.1 Redis
Sentinel:自动故障切换主副本(stateFUL IP/名称)。
集群:sharding+auto failover;客户必须支持"MOVED/ASK"重定向。
AOF/RDB:对于通常为"appendfsync everysec"的腰果,可以没有持久性。
10.2 Memcached
没有开箱即用的复制。可靠性-通过多服务器shard+replay 'n' (client-side)。
当脚趾下降时,脚趾会增加错误和"重新训练"腰果。
10.3个K8s和网络方面
Redis/Memcached不喜欢pod's的频繁疗养;使用固定的PVC/POD IP AZ上的StatefulSet+反代码。
放置PodDisruptionBudget和TopologySpreadConstraints。
11)交易、脚本和原子性(Redis)
INCR/DECR,HINCRBY-计数器,配额,限额限制(仅考虑persist)。
MULTI/EXEC是一组原子命令。
Lua(EVAL)是没有比赛的阅读修改写作。
管道-减少RTT(尤其是在网络跳跃中)。
lua
-- KEYS[1]=bucket, ARGV[1]=capacity, ARGV[2]=refill_rate_per_sec, ARGV[3]=now_ms
-- Returns 1 if the token is issued, otherwise 0
12)队列、pub/sub和Streams (Redis)
Pub/Sub:残疾,信号。没有保存,只有在线听众。
Streams:确认事件队列(ACK),消费者组,retrai-方便写作/粉丝外出。
Lists("BRPOP"):简单的队列。
不要将Redis用作没有back的"单一总线"-它是kesh/快速总线,不是Kafka。
13)安全和访问
隔离网络/VPC,ingress级别的mTLS,ACL/密码(Redis 6+中的"requirepass"/ACL)。
通过ACL在Redis("CONFIG","FLUSHALL","KEYS")中破坏危险。
对于Memcached,不听公共接口,"-U 0"(没有UDP),只有私有网络。
PII不存储;如果需要-应用程序级别的短TTL+加密。
14)可观察性和维护
关键指标:- Hit ratio/Miss ratio(通过namespace/路线)。
- Latency p95/p99命令"GET/SET/MGET",时间轴。
- Evictions и OOM errors.
- Replication lag (Redis), cluster state, migrate/rehash events.
- 按流量/字节排列的Top-N键。
- Logs:慢命令("slowlog"),网络错误。
- Dashbords:通用(CPU/RAM/connections),命令,群集插槽,sentinels,通过Prometheus出口商。
15)Configs和部署-示例
15.1 Redis Sentinel(片段)
port 6379 protected-mode yes appendonly yes appendfsync everysec maxmemory-policy allkeys-lfu
`sentinel.conf`:
sentinel monitor m1 10. 0. 0. 11 6379 2 sentinel auth-pass m1 sentinel down-after-milliseconds m1 5000 sentinel failover-timeout m1 60000
15.2 Redis Cluster (helm values,简化)
yaml cluster:
enabled: true nodes: 6 # 3 masters + 3 replicas persistence:
size: 100Gi resources:
requests: { cpu: "500m", memory: "2Gi" }
15.3 Memcached (deployment)
yaml containers:
- image: memcached:1. 6 args: ["-m", "32768", "-I", "2m", "-v", "-t", "8", "-o", "modern"]
ports: [{ containerPort: 11211 }]
15.4 NGINX作为读取代理(API轮廓)
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m max_size=10g inactive=10m;
map $request_uri $cache_key { default "api:$request_uri"; }
location /api/ {
proxy_cache api;
proxy_cache_valid 200 1m;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
proxy_cache_lock on; # singleflight на уровне NGINX proxy_cache_key $cache_key;
proxy_pass http://backend;
}
16)测试和门户
"冷/热/热kesh"负载配置文件。
注射失误(大量)-起源必须经受"再培训"。
Alerts:命中率的急剧下降,小姐的上升,雪崩的变化,时间的增长。
17)反模式
在没有AOF/RDB且没有冗余的情况下将"真相"存储在Redis中。
对于波动数据,TTL=0(无限)→永久性非约束性。
大量销售"KEYS"。
缺少jitter/soft-TTL →同步过期和暴风雨。
每个团队只有一个实例,没有硬化/复制副本。
将Memcached用于需要原子性/脚本的任务。
18)实施清单(0-45天)
0-10天
选择一个模板(cache-aside+L1/L2),描述键、TTL、nijspace。
包括jitter/soft-TTL,单飞;基本Alerta/dashbords。
对于Redis-自定义ACL,保护模式,slowlog, maxmemory-policy.
11-25天
转至副本(Redis Cluster或客户端哈希)。
通过pub/sub或neimspace版本致残;DB的outbox。
腰果"再培训"负载测试;limiting origin.
26-45天
Autopromo/Canary TTL,在发布前加热。
用于写入/背景对接的流。
每周报告最高,最高密钥,内存成本。
19)成熟度量标准
Hit-ratio L2 ≥ 80%(路线/航线间统计)。
P95 GET <2-3 ms (in-DC),错误<SLO起源。
0暴风雨大规模残疾(通过测试证明)。
自动失效和重置。
硬化/复制覆盖1个节点的故障,而没有明显的降级。
20)结论
强大的腰果体系结构是钥匙和TTL学科,防暴保护,适当的硬化和可预测的排出。Redis提供了丰富的语义,持续性和原子性;Memcached-最大限度的简单性和速度。添加可观察性,事件障碍,L1+L2,kesh将成为平台加速器而不是随机下降和"神秘"错误的来源。