双缓存防止缓存雪崩

双缓存防止缓存雪崩,原理不难。 并发量非常大的WEB应用可以用上。
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); 
}


猜你喜欢

转载自xiemingmei.iteye.com/blog/2088292