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); }