简单处理惩罚K->V缓存失效后高并发接见导致数据库负载急剧上升的题目
添加时间:2013-5-29 点击量:
日常编程中,对于一些有必然并发量或数据量较高的数据库操纵,我们都邑在前端加一层缓存层,并设置失效时候,如今一般是mongoDB或memcached,简单流程如下:
这个模式在并发量并非太高或数据操纵效力很高的景象下根蒂根基没有什么题目。
然则也许你已经看到了,if(缓存失效 && 正好碰到并发量很高 && 数据库操纵时候长) then?
1. 缓存失效
2. 第一个过程去数据库获取新数据,假如包含SQL+法度逻辑耗时5S
3. 这5S内,第二个、第三个...第N个都只是获取到已失效的缓存,于是也都连接数据库...
4. 成果显而易见,数据库锁表 -> 数据库累计多量过程 -> 直至数据库挂掉!
那么,如何去解决这个题目呢?其实最简单的规划就是:
添加一个标识表记标帜,类似文件锁,用于断定此时法度是否正在更新缓存。
若是,则直接返回旧缓存(标识表记标帜有设置失效时候,避免因为法度错误导致标识表记标帜未删除而引起的缓存不更新题目)
若否,则设置一个标识表记标帜,然掉队行数据获取及缓存更新,最后删除标识表记标帜。
PS. 第一次生成缓存的话可能会有些用户无法看到数据,不过这个几率很小,且可以经由过程其他体式格式如手动生成之类去解决。
流程如下:
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
日常编程中,对于一些有必然并发量或数据量较高的数据库操纵,我们都邑在前端加一层缓存层,并设置失效时候,如今一般是mongoDB或memcached,简单流程如下:
这个模式在并发量并非太高或数据操纵效力很高的景象下根蒂根基没有什么题目。
然则也许你已经看到了,if(缓存失效 && 正好碰到并发量很高 && 数据库操纵时候长) then?
1. 缓存失效
2. 第一个过程去数据库获取新数据,假如包含SQL+法度逻辑耗时5S
3. 这5S内,第二个、第三个...第N个都只是获取到已失效的缓存,于是也都连接数据库...
4. 成果显而易见,数据库锁表 -> 数据库累计多量过程 -> 直至数据库挂掉!
那么,如何去解决这个题目呢?其实最简单的规划就是:
添加一个标识表记标帜,类似文件锁,用于断定此时法度是否正在更新缓存。
若是,则直接返回旧缓存(标识表记标帜有设置失效时候,避免因为法度错误导致标识表记标帜未删除而引起的缓存不更新题目)
若否,则设置一个标识表记标帜,然掉队行数据获取及缓存更新,最后删除标识表记标帜。
PS. 第一次生成缓存的话可能会有些用户无法看到数据,不过这个几率很小,且可以经由过程其他体式格式如手动生成之类去解决。
流程如下:
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》