定义 缓存击穿 一个高并发热点Key在某一时刻过期,此时如果有大量查询请求,就会全部打到数据库,导致数据库压力剧增甚至崩溃。 解决方法 互斥锁 互斥锁+−⟲ 开始 提交id 从Redis查询缓存 再次从Redis查询缓存 缓存是否命中 缓存是否命中 返回数据 结束 未命中 尝试获取互斥锁 是否获取到锁 是 根据id查询数据库 将数据写入Redis 释放互斥锁 自旋休眠一段时间 否 命中 未命中 Link to original 逻辑过期 逻辑过期+−⟲ 开始 提交id 从Redis查询缓存 再次从Redis查询缓存 开启独立线程 根据id查询数据库 尝试获取互斥锁 缓存是否命中 缓存是否过期 缓存是否过期 是否获取到锁 未命中 返回空 返回数据 结束 命中 未过期 过期 否 是 未过期 过期 将数据写入Redis,并写入逻辑过期时间 释放互斥锁 Link to original
+−⟲ 开始 提交id 从Redis查询缓存 再次从Redis查询缓存 缓存是否命中 缓存是否命中 返回数据 结束 未命中 尝试获取互斥锁 是否获取到锁 是 根据id查询数据库 将数据写入Redis 释放互斥锁 自旋休眠一段时间 否 命中 未命中
+−⟲ 开始 提交id 从Redis查询缓存 再次从Redis查询缓存 开启独立线程 根据id查询数据库 尝试获取互斥锁 缓存是否命中 缓存是否过期 缓存是否过期 是否获取到锁 未命中 返回空 返回数据 结束 命中 未过期 过期 否 是 未过期 过期 将数据写入Redis,并写入逻辑过期时间 释放互斥锁