缓存失效瞬间高并发访问导致数据库负载升高的问题处理

问题描述:

     使用的缓存系统是memcached,SQL更新周期是10min,更新的sql运行时间是1s,在更新缓存时缓存失效,第一个进程会去数据库请求新数据,但是在未返回结果之前,后续的进程也进入到数据库中请求新数据。如果此时正好碰到高并发,成百上千的SQL会进入数据库同时执行,导致数据库负载瞬间飙升。借一张图来描述一下流程:
缓存失效瞬间高并发访问导致数据库负载升高的问题处理


收集到的解决方案:

1.添加更新标记。缓存需要更新时,由第一个进程去数据库中获取数据,剩下的进程读取旧缓存,直至缓存更新。
2.使用独立的进程更新缓存,其余进程不允许更新,只能读取。
3.加“锁”实现。实现方案较复杂,可参考链接 http://www.linuxidc.com/Linux/2013-07/86960.htm
4.双缓存方案。即使用两层缓存,第一层缓存失效的话,还有一层缓存顶上。推荐此方案。

参考资料:

1. 解决缓存失效后高并发访问导致数据库负载急剧上升的问题  http://blog.chinaunix.net/uid-20472336-id-3751970.html
2.高并发访问下避免对象缓存失效引发Dogpile效应 http://www.linuxidc.com/Linux/2013-07/86960.htm
上一篇:Fastjson 在HiTSDB中的应用


下一篇:Facebook TSDB论文翻译