0907期《程序员》杂志架构栏目中刊登了刘如鸿的《关于大规模系统缓存设计的一些考虑(上)》一文,由于篇幅关系,现将其中的源代码在此贴出。 import java.util.Dictionary; import java.util.zip.*; import java.util.*; public class Program { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub char c='a'; //初始化需要管理的Key Item String[] dic=new String[26 * 26 * 26]; for(int i=0;i<26;i++){ for(int j=0;j<26;j++){ for (int k = 0; k < 26; k++) { dic[i* 26 * 26 +j * 26 + k]=""+((char)(c+i)) + ((char)(c+j))+((char)(c+k)); } } } HashMap<String, HashMap<String,Object>> nodes=new HashMap<String, HashMap<String,Object>>(); //设置三个缓存节点 for (int i = 0; i < 3; i++) { AddNode(nodes); } //将数据放入缓存 for (int i = 0; i < dic.length; i++) { String serverNode=getServerNode(dic[i], nodes.size()); HashMap<String, Object> cache=(HashMap<String, Object>)nodes.get(serverNode); cache.put(dic[i], "value_"+dic[i]); } int serverCount=nodes.size(); int hitCount=0; System.out.println("在缓存初始化完毕的情况下进行查询"); cacheHitRate(nodes, dic); System.out.println("尝试增加一个缓存服务节点"); hitCount=0; AddNode(nodes); cacheHitRate(nodes, dic); } private static String getServerNode(String key,int serverCount){ int nodePos= key.hashCode() % serverCount; String serverNode="Node"+(nodePos+1); return serverNode; } private static void cacheHitRate(HashMap<String, HashMap<String,Object>> nodes,String[] dic){ int hitCount=0; int serverCount=nodes.size(); for (int i = 0; i < dic.length; i++) { String serverNode=getServerNode(dic[i],serverCount); HashMap<String,Object> cache=nodes.get(serverNode); if(cache!=null){ if(cache.containsKey(dic[i])){ hitCount++; } } } System.out.printf("查询次数:%d ,缓存命中率: %5.2f%% /r/n",dic.length,hitCount * 1.0 /dic.length * 100); } private static void AddNode(HashMap<String, HashMap<String,Object>> nodes){ String nodeKey="Node"+ (nodes.size()+1); nodes.put(nodeKey, new HashMap<String, Object>()); } }