4rr 发表于 2014-4-11 22:56:13

session共享--实现memcache集群

   memcache在session共享中起着重要的作用,因为咱们所有的数据都是放到这里面的,所以这里咱们肯定不能只用一台memcache,需要将memcache集群,我这里是通过代码实现的。整体的思路就是在初始化的时候,将所有memcache的地址全部读取出来,在存数据的时候向所有memcache中都放值,在取的时候,随机一台读取,如果没有,则轮询读,直到读取到值为值。下面上具体的代码。
1. 放值
/**
* 将数据存储到Memcached中
* @param key 键值
* @param value 对象
*
* 此方法存储的value在Memcached中永远都不会过期,只有当Memcached的内存占满时
* 才会根据Memcached自身的最长时间不使用的算法将其中的一些value清除
*/
public void setMemcached(String key, Object value) {

for(int i=0;i<mcpool.size();i++)
{
   MemCachedClient mc=(MemCachedClient)mcpool.get(i);
   mc.set(appName + key, value);
}
}

2.取值
/**
* 随机从一台服务器上查找对应key的值
* 若有,则返回
* 若没有,则遍历所有服务器
*/
public Object getMemcached(String key) {

int num=(Math.abs(new Random().nextInt()))%mcpool.size();
Object object=null;
object=((MemCachedClient)mcpool.get(num)).get(appName + key);
if(object!=null)
{
   return object;
}
for(int i=0;i<mcpool.size();i++)
{
   MemCachedClient mc=(MemCachedClient)mcpool.get(i);
   object=mc.get(appName + key);
   if(object!=null)
   {
    return object;
   }
}
return object;
}
       注:大家都知道,memcache存的都是序列化后的值,取的时候,再用反序列化的方式读取出来。我们这里用的writeObject和readObject。但也是因为这个原理,我们在存各个webapp自己的应用的时候,由于无法获得对应的class文件,导致无法反序列化读出数据。这个问题的解决方案在后面给出。


页: [1]
查看完整版本: session共享--实现memcache集群