
1.加锁互斥锁// 缓存不存在 if (cache null) { // 尝试获取分布式锁比如setnx if (lock(lock:goods:1001)) { try { // 查DB data db.query(); // 回写缓存 redis.set(key, data, expire); return data; } finally { unlock(); } } else { // 没抢到锁短暂休眠后重试 sleep(50ms); return getGoodsFromCache(); } }区分 互斥锁 X锁这里的互斥锁指在redis加分布式锁SET lock:goods:1001 唯一标识 NX EX 过期时间这里边的lock是包装了redis里面加锁的命令解锁不能随便解锁随便DEL必须Lua 脚本原子校验 删除-- 判断value是自己的才删 if redis.call(get,KEYS[1]) ARGV[1] then return redis.call(del,KEYS[1]) else return 0 end2.逻辑过期物理上不设置 TTL在 value 里存逻辑过期时间后台异步更新CacheItem item redis.get(key); if (item null) { // 兜底初始化 if (lock()) { data db.query(); redis.set(key, new CacheItem(data, now30s)); unlock(); } return redis.get(key).data; } // 判断逻辑过期 if (item.expireTime now) { if (tryLock()) { // 异步线程更新主线程直接返回旧值 threadPool.submit(() - { newData db.query(); redis.set(key, new CacheItem(newData, now30s)); unlock(); }); } } return item.data;3.提前刷新定时任务提前刷新适合热点固定、能提前预知的 key首页爆款商品缺点资源占用高热点不固定时很难覆盖4.限流不推荐单纯延长过期时间只能缓解不能根治依然有击穿风险对该热点接口加单机 / 分布式限流一旦检测到缓存失效限制 QPS保护数据库。一般配合上面方案一起用不作为主方案。