关于两个memcached服务器问题

sjfengOS 发布于 2012/11/13 14:35
阅读 1K+
收藏 1

有两台服务器(192.168.2.108   ----  192.168.2.109)分别装有memcached服务

192.168.2.108上启动memcached服务为memcached  -d -m 10 -u sjfeng -p 11211 -c 256

192.168.2.109上启动memcached服务也为memcached -d -m 10 -u sjfeng -p 11211 -c 256

这样的分布配置是不就把108和109上的内存都共享出去了

 

但有不解看下面代码

java编写的大致代码如下

 

package com.doujiao.website.app;

import java.util.Date;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class MemcachedManager {
 
 //创建全局的唯一实例
 private static MemCachedClient mcc=new MemCachedClient();
 
 private static MemcachedManager memcachedManager=new MemcachedManager();
 
 // 设置与缓存服务器的连接池
 static{
  // 服务器列表和其权重
  String[] servers={"192.168.2.109:11211","192.168.2.108:11211"};
  Integer[] weights={3};
  
        // 获取socke连接池的实例对象  
        SockIOPool pool = SockIOPool.getInstance();  
 
        // 设置服务器信息  
        pool.setServers(servers);  
        pool.setWeights(weights);  
 
        // 设置初始连接数、最小和最大连接数以及最大处理时间  
        pool.setInitConn(5);  
        pool.setMinConn(5);  
        pool.setMaxConn(250);  
        pool.setMaxIdle(1000 * 60 * 60 * 6);  
 
        // 设置主线程的睡眠时间  
        pool.setMaintSleep(30);  
 
        // 设置TCP的参数,连接超时等  
        pool.setNagle(false);  
        pool.setSocketTO(3000);  
        pool.setSocketConnectTO(0);  
 
        // 初始化连接池  
        pool.initialize();  
 
        // 压缩设置,超过指定大小(单位为K)的数据都会被压缩  
        mcc.setCompressEnable(true);  
        mcc.setCompressThreshold(64 * 1024); 
  
 }
 /** 
     * 保护型构造方法,不允许实例化! 
     *  
     */ 
 private MemcachedManager() {  
 
    }  


 /**
  * 获取唯一实例
  * @return MemcachedManager
  */
 public static MemcachedManager getInstance(){
  return memcachedManager;
 }
 
 /** 
     * 添加一个指定的值到缓存中. 
     *  
     * @param key 
     * @param value 
     * @return 
     */ 
    public boolean add(String key, Object value) {  
        return mcc.add(key, value);  
    }  
 
    public boolean add(String key, Object value, Date expiry) {  
        return mcc.add(key, value, expiry);  
    }  
 
    public boolean replace(String key, Object value) {  
        return mcc.replace(key, value);  
    }  
 
    public boolean replace(String key, Object value, Date expiry) {  
        return mcc.replace(key, value, expiry);  
    }  
   
    public boolean set(String key, Object value){
     return mcc.set(key, value);
    }
    public boolean set(String key, Object value, Date expiry) {  
        return mcc.set(key, value, expiry);  
    }  
 
    /** 
     * 根据指定的关键字获取对象. 
     *  
     * @param key 
     * @return 
     */ 
    public Object get(String key) {  
        return mcc.get(key);  
    }  

   
 public static void main(String[] args) {
  MemcachedManager cache=MemcachedManager.getInstance();
  cache.set("hello", "ggggg");
  System.out.println("get value : "+cache.get("hello"));
 }

}

小弟现在不明白的是这个key--->hello是存在哪个服务器上了

是两台都有key---->hello?(key是不允许重复的这里不解)

如果不是是否memcached服务自己提供的算法来分配保存?

望各个大牛 大侠 多多指教

 

加载中
0
八月下沙
八月下沙

memcached有自己和算法机制,能够比较准确根据key算出这个key在哪个服务器上。举个例子,通过key可以得出唯一的hash值,再通过规则确定该hash值在哪个服务器上,进而得到相应的value

关键这个不如关心下memcached的内存分配机制,你说的把108,109内存分配出去是不准确的,实际上假设启动时指定512M内存,实际启动后并没有马上占用所有内存

0
果酱
果酱
主要看你客户端是怎么配置的,如果1个客户端配置了这2个memcached节点,那么是采用一致性哈希算法去分配,如果key重复会覆盖
返回顶部
顶部