跳转至

第七章:分布式缓存

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

下一章我们将学习最佳实践。