双缓存防止缓存雪崩,原理不难。 并发量非常大的WEB应用可以用上。
http://www.oschina.net/question/12_26514
存在:key1: time,key2: time+n分
原理:get时,如果key1失效,则取key2返回,同时启动线程去刷新key1、key2。
有多个线程来刷新,则需要并发控制,只让一个线程访问数据库。
分布式系统怎么来并发控制? 可用memcached的add方法,如下:
如果key1、key2都是失效了,则需要启动一个线程去刷新缓存,
然后取缓存逻辑的方法,则需要sleep(time)一下,然后重取, 重试3-5次应该足够了。
伪代码如下:
http://www.oschina.net/question/12_26514
存在:key1: time,key2: time+n分
原理:get时,如果key1失效,则取key2返回,同时启动线程去刷新key1、key2。
有多个线程来刷新,则需要并发控制,只让一个线程访问数据库。
分布式系统怎么来并发控制? 可用memcached的add方法,如下:
/**防同ID重复提交*/
String preventKey = "unique_id_" + id;
boolean isSuccess = xClient.add(preventKey, 3*60, "Y");
if (!isSuccess){
throw new PayException("请勿重复提交该订单");
}
如果key1、key2都是失效了,则需要启动一个线程去刷新缓存,
然后取缓存逻辑的方法,则需要sleep(time)一下,然后重取, 重试3-5次应该足够了。
伪代码如下:
//重试3次
for(int i=0;i<3;i++) {
value = get(key1)
if (value!=null) {
return value;
}
if(获取lock) {
启动刷新key1、key2的线程;
}
value = get(key2)
if (value != null) {
return value;
}
sleep(200);
}