问题描述:
使用的缓存系统是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.html2.高并发访问下避免对象缓存失效引发Dogpile效应 http://www.linuxidc.com/Linux/2013-07/86960.htm