第七章:分布式缓存¶
Redis 集群¶
主从复制¶
主从架构:
┌─────────────┐
│ Master │ 读写
└─────────────┘
│
┌───┴───┐
▼ ▼
┌─────┐ ┌─────┐
│Slave│ │Slave│ 只读
└─────┘ └─────┘
哨兵模式¶
哨兵架构:
┌─────────────────────────────┐
│ Sentinel │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ S1 │ │ S2 │ │ S3 │ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────┘
│
▼
┌─────────────────────────────┐
│ Redis │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Master│ │Slave│ │Slave│ │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────┘
Cluster 模式¶
Cluster 架构:
┌─────────────────────────────────────┐
│ Redis Cluster │
│ ┌──────────┐ ┌──────────┐ │
│ │ Master 1 │ │ Master 2 │ │
│ │ Slot │ │ Slot │ │
│ │ 0-5460 │ │ 5461-10922│ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Slave 1 │ │ Slave 2 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────┘
缓存一致性¶
延迟双删¶
def update_data(key, value):
# 1. 删除缓存
redis.delete(key)
# 2. 更新数据库
db.update(key, value)
# 3. 延迟删除缓存
time.sleep(0.5)
redis.delete(key)
订阅 Binlog¶
# 使用 Canal 订阅 MySQL Binlog
def on_binlog_event(event):
if event.type == 'UPDATE':
key = f"table:{event.table}:{event.id}"
redis.delete(key)
小结¶
分布式缓存要点:
- Redis 集群:主从、哨兵、Cluster
- 缓存一致性:延迟双删、订阅 Binlog
下一章我们将学习最佳实践。