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文件,导致无法反序列化读出数据。这个问题的解决方案在后面给出。
参考阅读:
Memcached 安装及启动脚本 http://www.linuxidc.com/Linux/2013-07/87641.htm
PHP中使用Memcached的性能问题 http://www.linuxidc.com/Linux/2013-06/85883.htm
Ubuntu下安装Memcached及命令解释 http://www.linuxidc.com/Linux/2013-06/85832.htm
Memcached的安装和应用 http://www.linuxidc.com/Linux/2013-08/89165.htm
使用Nginx Memcached的小图片存储方案 http://www.linuxidc.com/Linux/2013-11/92390.htm
Memcached使用入门 http://www.linuxidc.com/Linux/2011-12/49516p2.htm