一、需求
前段时间做了一个项目,在后台有很多的数据都放入到了cache中了,而且还会对cache中的数据进行更新。如果只有一台server没有任何问题,但是如果考虑到集群负载平衡,连接多个server的时候,就有问题出现了,怎么样才能保证多个server之间cache的同步呢?请看下面的部署图。
利用JGroups同步两台server之间的cache。

二、引入JGroups
JGroups是一个可靠的组间通讯工具,进程可以加入一个通讯组,给组内所有的成员或单独的成员发送消息,同样,也可以从组中的成员处接收消息。
系统会记录组的每一个成员,在新成员加入或是现有的成员离开或是崩溃时,会通知组内的其他成员。

当我们更新一台server上的cache的时候,利用JGroups进行广播,其他的server接收到广播,根据接收到的信息来更新自己的cache,这样达到了
每个server的cache同步。

三、实现
1、定义一个接口BaseCache规定出对cache类操作的方法

 1利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。public interface BaseCache 利用JGroups同步两台server之间的cache。{
 2利用JGroups同步两台server之间的cache。    
 3利用JGroups同步两台server之间的cache。    public void put(String key, Object ob);
 4利用JGroups同步两台server之间的cache。    public Object get(String key);
 5利用JGroups同步两台server之间的cache。    
 6利用JGroups同步两台server之间的cache。    public void delete(String key);
 7利用JGroups同步两台server之间的cache。    public void batchDelete(String[] list);
 8利用JGroups同步两台server之间的cache。    public void batchDelete(List list);
 9利用JGroups同步两台server之间的cache。    public void deleteAll();
10利用JGroups同步两台server之间的cache。    
11利用JGroups同步两台server之间的cache。}


2、定义一个同步器(CacheSynchronizer),这个类利用JGroups进行发送广播和接收广播

 1利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。public class CacheSynchronizer 利用JGroups同步两台server之间的cache。{
 2利用JGroups同步两台server之间的cache。    private static String protocolStackString=
 3利用JGroups同步两台server之间的cache。        "UDP(mcast_addr=235.11.17.19;mcast_port=32767;ip_ttl=3;"+
 4利用JGroups同步两台server之间的cache。        "mcast_send_buf_size=150000;mcast_recv_buf_size=80000):"+
 5利用JGroups同步两台server之间的cache。        "PING(timeout=2000;num_initial_members=3):"+
 6利用JGroups同步两台server之间的cache。        "MERGE2(min_interval=5000;max_interval=10000):"+
 7利用JGroups同步两台server之间的cache。        "FD_SOCK:"+
 8利用JGroups同步两台server之间的cache。        "VERIFY_SUSPECT(timeout=1500):"+
 9利用JGroups同步两台server之间的cache。        "pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800):"+
10利用JGroups同步两台server之间的cache。        "pbcast.STABLE(desired_avg_gossip=20000):"+
11利用JGroups同步两台server之间的cache。        "UNICAST(timeout=2500,5000):"+
12利用JGroups同步两台server之间的cache。        "FRAG:"+
13利用JGroups同步两台server之间的cache。        "pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=false)";
14利用JGroups同步两台server之间的cache。    private static String groupName="YHPTEST";
15利用JGroups同步两台server之间的cache。    
16利用JGroups同步两台server之间的cache。    private Channel jgroupsChannel=null;
17利用JGroups同步两台server之间的cache。    
18利用JGroups同步两台server之间的cache。    //inner class ,定义接收广播,已经对接收到的广播进行处理
19利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    private class ReceiveCallback extends ExtendedReceiverAdapter利用JGroups同步两台server之间的cache。{
20利用JGroups同步两台server之间的cache。        private BaseCache cache=null;
21利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        public void setCache(BaseCache baseCache)利用JGroups同步两台server之间的cache。{//设置cache类
22利用JGroups同步两台server之间的cache。            cache=baseCache;
23利用JGroups同步两台server之间的cache。        }

24利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        public void receive(Message msg) 利用JGroups同步两台server之间的cache。{
25利用JGroups同步两台server之间的cache。            if(cache==nullreturn ;
26利用JGroups同步两台server之间的cache。            String strMsg = (String) msg.getObject();
27利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。            if(strMsg!=null&&(!"".equals(strMsg)))利用JGroups同步两台server之间的cache。{
28利用JGroups同步两台server之间的cache。                cache.put(strMsg, strMsg);    //根据接收到的广播,同步cache
29利用JGroups同步两台server之间的cache。            }

30利用JGroups同步两台server之间的cache。        }

31利用JGroups同步两台server之间的cache。    }

32利用JGroups同步两台server之间的cache。    
33利用JGroups同步两台server之间的cache。    private ReceiveCallback recvCallback = null;
34利用JGroups同步两台server之间的cache。    
35利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public CacheSynchronizer(BaseCache cache) throws Exception利用JGroups同步两台server之间的cache。{
36利用JGroups同步两台server之间的cache。        jgroupsChannel = new JChannel(protocolStackString);
37利用JGroups同步两台server之间的cache。        recvCallback = new ReceiveCallback();
38利用JGroups同步两台server之间的cache。        recvCallback.setCache(cache);
39利用JGroups同步两台server之间的cache。        jgroupsChannel.setReceiver(recvCallback);
40利用JGroups同步两台server之间的cache。        jgroupsChannel.connect(groupName);
41利用JGroups同步两台server之间的cache。    }

42利用JGroups同步两台server之间的cache。    
43利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    /** *//**
44利用JGroups同步两台server之间的cache。     * 发送广播信息,我们可以自定义广播的格式。
45利用JGroups同步两台server之间的cache。     * 这里简单起见,仅仅发送一个字符串
46利用JGroups同步两台server之间的cache。     * @param sendMsg
47利用JGroups同步两台server之间的cache。     * @throws Exception
48利用JGroups同步两台server之间的cache。     */

49利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public void sendCacheFlushMessage(String sendMsg)throws Exception 利用JGroups同步两台server之间的cache。{
50利用JGroups同步两台server之间的cache。        jgroupsChannel.send(nullnull, sendMsg); //发送广播
51利用JGroups同步两台server之间的cache。        
52利用JGroups同步两台server之间的cache。    }

53利用JGroups同步两台server之间的cache。}


3、定义cache类,调用同步器同步cache

 1利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。public class TestDataCache implements BaseCache 利用JGroups同步两台server之间的cache。{
 2利用JGroups同步两台server之间的cache。    private Map dataCache=null;//保持cache数据
 3利用JGroups同步两台server之间的cache。    private CacheSynchronizer cacheSyncer = null//同步器
 4利用JGroups同步两台server之间的cache。    
 5利用JGroups同步两台server之间的cache。    //inner class for thread safe.
 6利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    private static final class TestDataCacheHold利用JGroups同步两台server之间的cache。{
 7利用JGroups同步两台server之间的cache。        private static TestDataCache  theSingleton=new TestDataCache();        
 8利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        public static TestDataCache getSingleton()利用JGroups同步两台server之间的cache。{
 9利用JGroups同步两台server之间的cache。            return theSingleton;
10利用JGroups同步两台server之间的cache。        }

11利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        private TestDataCacheHold()利用JGroups同步两台server之间的cache。{}
12利用JGroups同步两台server之间的cache。    }

13利用JGroups同步两台server之间的cache。    
14利用JGroups同步两台server之间的cache。    //Prevents to inherit
15利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    private TestDataCache()利用JGroups同步两台server之间的cache。{
16利用JGroups同步两台server之间的cache。        dataCache=new HashMap();
17利用JGroups同步两台server之间的cache。        createSynchronizer();
18利用JGroups同步两台server之间的cache。    }

19利用JGroups同步两台server之间的cache。    
20利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public static TestDataCache getInstance()利用JGroups同步两台server之间的cache。{
21利用JGroups同步两台server之间的cache。        return TestDataCacheHold.getSingleton();
22利用JGroups同步两台server之间的cache。    }

23利用JGroups同步两台server之间的cache。    
24利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public CacheSynchronizer getSynchronizer()利用JGroups同步两台server之间的cache。{
25利用JGroups同步两台server之间的cache。        return cacheSyncer;
26利用JGroups同步两台server之间的cache。    }

27利用JGroups同步两台server之间的cache。    
28利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public int getCacheLength()利用JGroups同步两台server之间的cache。{
29利用JGroups同步两台server之间的cache。        return dataCache.size();
30利用JGroups同步两台server之间的cache。    }

31利用JGroups同步两台server之间的cache。    
32利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public void createSynchronizer()利用JGroups同步两台server之间的cache。{
33利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        try利用JGroups同步两台server之间的cache。{
34利用JGroups同步两台server之间的cache。            cacheSyncer=new CacheSynchronizer(this);
35利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        }
catch(Exception e)利用JGroups同步两台server之间的cache。{
36利用JGroups同步两台server之间的cache。            e.printStackTrace();
37利用JGroups同步两台server之间的cache。        }

38利用JGroups同步两台server之间的cache。    }

39利用JGroups同步两台server之间的cache。    
40利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public void batchDelete(String[] list) 利用JGroups同步两台server之间的cache。{
41利用JGroups同步两台server之间的cache。        if(list!=nullreturn ;
42利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        synchronized (dataCache)利用JGroups同步两台server之间的cache。{
43利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。            for(int i=0;i<list.length;i++)利用JGroups同步两台server之间的cache。{
44利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。                if(list[i].length()>0)利用JGroups同步两台server之间的cache。{
45利用JGroups同步两台server之间的cache。                    dataCache.remove(list[i]);
46利用JGroups同步两台server之间的cache。                }

47利用JGroups同步两台server之间的cache。            }

48利用JGroups同步两台server之间的cache。        }

49利用JGroups同步两台server之间的cache。
50利用JGroups同步两台server之间的cache。    }

51利用JGroups同步两台server之间的cache。
52利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public void batchDelete(List list) 利用JGroups同步两台server之间的cache。{
53利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        synchronized (dataCache)利用JGroups同步两台server之间的cache。{
54利用JGroups同步两台server之间的cache。            Iterator itor=list.iterator();
55利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。            while(itor.hasNext())利用JGroups同步两台server之间的cache。{
56利用JGroups同步两台server之间的cache。                String tmpKey=(String)itor.next();
57利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。                if(tmpKey.length()>0)利用JGroups同步两台server之间的cache。{
58利用JGroups同步两台server之间的cache。                    dataCache.remove(tmpKey);
59利用JGroups同步两台server之间的cache。                }

60利用JGroups同步两台server之间的cache。            }

61利用JGroups同步两台server之间的cache。        }

62利用JGroups同步两台server之间的cache。    }

63利用JGroups同步两台server之间的cache。
64利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public void delete(String key) 利用JGroups同步两台server之间的cache。{
65利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        synchronized (dataCache) 利用JGroups同步两台server之间的cache。{
66利用JGroups同步两台server之间的cache。            dataCache.remove(key);
67利用JGroups同步两台server之间的cache。        }

68利用JGroups同步两台server之间的cache。    }

69利用JGroups同步两台server之间的cache。
70利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public void deleteAll() 利用JGroups同步两台server之间的cache。{
71利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        synchronized (dataCache)利用JGroups同步两台server之间的cache。{
72利用JGroups同步两台server之间的cache。            dataCache.clear();
73利用JGroups同步两台server之间的cache。        }

74利用JGroups同步两台server之间的cache。
75利用JGroups同步两台server之间的cache。    }

76利用JGroups同步两台server之间的cache。
77利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。    public Object get(String key) 利用JGroups同步两台server之间的cache。{
78利用JGroups同步两台server之间的cache。        Object theObj=null;
79利用JGroups同步两台server之间的cache。利用JGroups同步两台server之间的cache。        synchronized (dataCache) 利用JGroups同步两台server之间的cache。

相关文章: