跳转至

第一章:缓存基础

什么是缓存?

缓存是临时存储,用于加速数据访问:

  • 减少延迟:从快速存储读取数据
  • 降低负载:减少数据库查询
  • 节省带宽:减少网络传输
  • 提升体验:更快的响应速度

缓存类型

按位置分类

类型 位置 示例
浏览器缓存 客户端 HTTP Cache
CDN 缓存 边缘节点 Cloudflare
应用缓存 应用服务器 本地内存
分布式缓存 缓存服务器 Redis
数据库缓存 数据库 MySQL Buffer Pool

按数据分类

类型 说明
数据缓存 查询结果缓存
页面缓存 HTML 页面缓存
对象缓存 序列化对象缓存
会话缓存 用户会话数据

缓存指标

命中率

命中率 = 缓存命中次数 / 总请求次数 × 100%

平均响应时间

平均响应时间 = (命中时间 × 命中次数 + 未命中时间 × 未命中次数) / 总请求次数

缓存更新策略

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

def write_data(key, data):
    # 同时写入缓存和数据库
    cache.set(key, data)
    db.update(key, data)

Write Behind

def write_data(key, data):
    # 只写缓存,异步写数据库
    cache.set(key, data)
    async_queue.push(key, data)

缓存问题

缓存穿透

# 解决方案:缓存空值
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)

小结

本章学习了:

  • ✅ 缓存概念
  • ✅ 缓存类型
  • ✅ 缓存指标
  • ✅ 更新策略
  • ✅ 缓存问题

下一章

第二章:三级缓存 - 学习三级缓存架构。