Session共享–实现Memcache集群

2022-06-30 21:05:02 浏览数 (1)

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

0 人点赞