β

缓存雪崩问题的解决办法

小景的博客 109 阅读

what

​    ​使用缓存(memcached, redis  或者其他)的经典方法, 每次查数据先去缓存里边查, 没有的话再去查db, 下次再来查询的时候缓存里边就有了。对于一般的应用的话db的读写频率的比例大约在 10 : 1 左右, 读的次数明显大于写的次数, 大多数请求到了缓存这里就 给搞定了, 只有少量的穿透来维护数据的更新.  这种做法是明智的, 服务器读内存的速度比读硬盘的速度快 10^5 - 10^6倍, 使用缓存可以大大增加用户的响应速度和服务器的处理能力。

but...

缓存确实是一个一举两得的办法, 所以我们对它很依赖!  在高并发的情况下, 缓存抗住了大批用户的同时请求, 但是缓存过期了, 瞬间大量的用户在缓存里边拿不到东西, 所有的请求都穿透了缓存, 请求涌到了db这里, db哪抗的住这么大批量的查询, 于是悲剧发生了, DB宕掉了....

how?

在缓存期前90%的时间, 我们要做的和之前没什么两样, 直接去缓存里边读就可以了, 在90% - 缓存过期的这一段时间内, 加锁来更新缓存, 让获取不到锁的请求直接去读缓存!!

At last

在初次请求的时候, 部分请求可能会因为并发问题没有获取到锁而查的缓存, 但是缓存预热之后就可以保证项目的稳定运行, 所以项目发布的时候最好有一个预热的过程。。

声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权
转载请注明来源: 小景的博客
本文链接地址: http://www.phpv5.com/blog/cache-crash
作者:小景的博客
积淀知识 分享经验
原文地址:缓存雪崩问题的解决办法, 感谢原作者分享。