第一章:缓存基础¶
什么是缓存?¶
缓存是临时存储,用于加速数据访问:
- 减少延迟:从快速存储读取数据
- 降低负载:减少数据库查询
- 节省带宽:减少网络传输
- 提升体验:更快的响应速度
缓存类型¶
按位置分类¶
| 类型 | 位置 | 示例 |
|---|---|---|
| 浏览器缓存 | 客户端 | HTTP Cache |
| CDN 缓存 | 边缘节点 | Cloudflare |
| 应用缓存 | 应用服务器 | 本地内存 |
| 分布式缓存 | 缓存服务器 | Redis |
| 数据库缓存 | 数据库 | MySQL Buffer Pool |
按数据分类¶
| 类型 | 说明 |
|---|---|
| 数据缓存 | 查询结果缓存 |
| 页面缓存 | HTML 页面缓存 |
| 对象缓存 | 序列化对象缓存 |
| 会话缓存 | 用户会话数据 |
缓存指标¶
命中率¶
平均响应时间¶
缓存更新策略¶
Cache Aside¶
def get_data(key):
# 1. 先查缓存
data = cache.get(key)
if data:
return data
# 2. 查数据库
data = db.query(key)
# 3. 写入缓存
if data:
cache.set(key, data, ttl=3600)
return data
def update_data(key, data):
# 1. 更新数据库
db.update(key, data)
# 2. 删除缓存
cache.delete(key)
Write Through¶
Write Behind¶
缓存问题¶
缓存穿透¶
# 解决方案:缓存空值
def get_data(key):
data = cache.get(key)
if data == "NULL":
return None
if data:
return data
data = db.query(key)
if data:
cache.set(key, data, ttl=3600)
else:
cache.set(key, "NULL", ttl=60) # 缓存空值
return data
缓存击穿¶
# 解决方案:互斥锁
def get_data(key):
data = cache.get(key)
if data:
return data
lock_key = f"lock:{key}"
if cache.setnx(lock_key, 1):
cache.expire(lock_key, 10)
try:
data = db.query(key)
cache.set(key, data, ttl=3600)
finally:
cache.delete(lock_key)
else:
time.sleep(0.1)
return get_data(key)
return data
缓存雪崩¶
# 解决方案:随机过期时间
def set_cache(key, data, base_ttl=3600):
import random
ttl = base_ttl + random.randint(0, 300)
cache.set(key, data, ttl=ttl)
小结¶
本章学习了:
- ✅ 缓存概念
- ✅ 缓存类型
- ✅ 缓存指标
- ✅ 更新策略
- ✅ 缓存问题
下一章¶
第二章:三级缓存 - 学习三级缓存架构。