百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 网站模板(百分百源码网)>电脑软件>服务器> Memcached 入门介绍(安装与配置)
分享本文到:

Memcached 入门介绍(安装与配置)

发布时间:05/16 来源:未知 浏览: 关键词:

Memcached是一个高机能的散布式内存对象缓存系统,用于动态Web利用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而供给动态、数据库驱动网站的速度。
Memcached基于一个存储键值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何说话来编写,并通过memcached协定与守护进程通讯。

下面来理解下Memcached怎么用~~

一、预备工作
到//www.jb51.net/softs/205838.html

下载memcached的windows版

再下载一个java_memcached-release.jar

二、安装
解压memcached-1.2.5-win32-bin.zip,CMD进入其目录,然后施行如下下令:

c:>memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start第一行是安装memcached成为服务,这样才能正常运转,否则运转失败!

第二行是启动memcached的,这里简略的只分配32M内存了(默许64M),然后监听本机端口和以守护进交运行。

施行结束后,我们就可以在任务治理器中看到memcached.exe这个进程了。

要是想要在统一台Windows机器中安装2个Memcached,请看这里

三、运用
此刻服务器已经正常运转了,下面我们就来写java的客户端连贯程序。

将java_memcached-release.zip解压,把java_memcached-release.jar文件复制到java项目的lib目录下,

然后我们来编写代码,比方我供给的一个利用类如下:

package memcached.test;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
 * 运用memcached的缓存实用类.
 */
public class MemCached {
  // 新建全局的独一实例
  protected static MemCachedClient mcc = new MemCachedClient();
  protected static MemCached memCached = new MemCached();
  // 设置与缓存服务器的连贯池
  static {
    // 服务器列表和其权重
    String[] servers = { "127.0.0.1:11211" };
    Integer[] weights = { 3 };
    // 获取socke连贯池的实例对象
    // 这个类用来新建治理客户端和服务器通信连贯池,
    // 客户端主要的工作(包括数据通信、服务器定位、hash码生成等)都是由这个类完成的。
    SockIOPool pool = SockIOPool.getInstance();
    // 设置服务器信息
    pool.setServers(servers);
    
    // 设置Server权重
    pool.setWeights(weights);
    // 设置初始连贯数、最小和最大连贯数以及最大处置工夫
    pool.setInitConn(5);
    pool.setMinConn(5);
    pool.setMaxConn(250);
    pool.setMaxIdle(1000 * 60 * 60 * 6);
    // 设置主线程的睡眠工夫
    pool.setMaintSleep(30);
    // 设置连贯心跳监测开关
    // true:每次通讯都要进行连贯是否有效的监测,造成通讯次数陡增,加大网络负载,
    // 因而在对HighAvailability要求比较高的场所应当设为true
    // 默许状态是false,倡议维持默许。
    pool.setAliveCheck(false);
    // 设置连贯失败恢复开关
    // 设置为true,当宕机的服务器启动或中止的网络连贯后,这个socket连贯还可继续运用,否则将不再运用.
    // 默许状态是true,倡议维持默许。
    pool.setFailback(true);
    // 设置容错开关
    // true:当目前socket不可用时,程序会主动查找可用连贯并返回,否则返回NULL
    // 默许状态是true,倡议维持默许。
    pool.setFailover(true);
    // 设置hash算法
    // alg=0 运用String.hashCode()获得hash code,该要领依赖JDK,可能和其他客户端不兼容,倡议不运用
    // alg=1 运用original 兼容hash算法,兼容其他客户端
    // alg=2 运用CRC32兼容hash算法,兼容其他客户端,机能优于original算法
    // alg=3 运用MD5 hash算法
    // 采纳前三种hash算法的时候,查找cache服务器运用余数要领。采纳最后一种hash算法查找cache服务时运用consistent要领。
    // 默许值为0
    pool.setHashingAlg(0);
    // 设置是否运用Nagle算法,由于我们的通信数据量平常都比较大(相对TCP控制数据)而且要求相应及时,
    // 因而该值需要设置为false(默许是true)
    pool.setNagle(false);
    
    // 设置socket的读取期待超时值
    pool.setSocketTO(3000);
    
    // 设置socket的连贯期待超时值
    pool.setSocketConnectTO(0);
    // 初始化连贯池
    pool.initialize();
    // 紧缩设置,超过指定大小(单位为K)的数据都会被紧缩
    // mcc.setCompressEnable(true);  //UnsupportedOperation
    // mcc.setCompressThreshold(64 * 1024);
  }
  private MemCached() {
  }
  /**
   * 获取独一实例.
   * singleton
   * @return
   */
  public static MemCached getInstance() {
    return memCached;
  }
  /**
   * 增加一个指定的键值对到缓存中.
   * 
   * @param key
   * @param value
   * @return
   */
  public boolean add(String key, Object value) {
    return mcc.add(key, value);
  }
  /**
   * 增加一个指定的键值对到缓存中.
   * 
   * @param key
   * @param value
   * @param expiry 多久之后逾期
   * @return
   */
  public boolean add(String key, Object value, Date expiry) {
    return mcc.add(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);
  }
  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);
  }
  
  
  /**
   * 依据指定的要害字获取对象.
   * 
   * @param key
   * @return
   */
  public Object get(String key) {
    return mcc.get(key);
  }
}
MemCached

写个Main要领测试下:

public static void main(String[] args) {
    MemCached cache = MemCached.getInstance();
    boolean result1 = cache.add("hello", 1234, new Date(1000 * 2));// 设置2秒后逾期
    System.out.println("第一次add : " + result1);
    System.out.println("Value : " + cache.get("hello"));
    
    boolean result2 =cache.add("hello", 12345, new Date(1000 * 2));// add fail
    System.out.println("第二次add : " + result2);
    
    boolean result3 =cache.set("hello", 12345, new Date(1000 * 2));// set successes
    System.out.println("调用set : " + result3);
    
    System.out.println("Value : " + cache.get("hello"));

    try {
      Thread.sleep(1000 * 2);
      System.out.println("已经sleep2秒了....");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("Value : " + cache.get("hello"));
  }

施行效果如下:

第一次add : true
Value : 1234
第二次add : false
调用set : true
Value : 12345
已经sleep2秒了....
Value : null

注明:

1.第二次add失败是由于"hello"这个key已经存在了。
2.调用set成功,是由于set的时候遮盖了已存在的键值对,这正是add和set的不一样之处
3.设置逾期之间之后,cache按时主动失效

上面的例子是关于根本数据类型,关于普通的POJO而言,要是要进行存储的话,那么比方让其实现java.io.Serializable接口。

由于memcached是一个散布式的缓存服务器,多台服务器间进行数据同享需要将对象序列化的,所以必须实现该接口,否则会报错的(java.io.NotSerializableException)。

下面来试试POJO的存储:

package memcached.test;
public class Person implements java.io.Serializable {
  private static final long serialVersionUID = 1L;

  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

简略的POJO对象

Main要领如下:

public static void main(String[] args) {
    MemCached cache = MemCached.getInstance();

    Person p1 = new Person();
    p1.setName("Jack");
    cache.add("bean", p1);
    
    Person p2 = (Person) cache.get("bean");
    System.out.println("name=" + p2.getName());//Jack
    p2.setName("Rose");
    
    // cache.replace("bean", p2);
    Person p3 = (Person) cache.get("bean");
    System.out.println("name=" + p3.getName());
  }

上面的代码中,我们通过p2.setName("Rose")修改了对象的名字,

最后一行打印的会是什么呢?

name=Jack
name=JackWhy?

这是由于我们修改的对象并不是缓存中的对象,而是通过序列化过来的一个实例对象
那么要修改怎么办?运用replace,注释掉的那一行把注释去除就可以了。

四、其他
Memcached的下令参数注明
-p <num>                监听的端口
-l <ip_addr>            连贯的IP地址, 默许是本机
-d start                   启动memcached服务
-d restart                重起memcached服务
-d stop|shutdown    关闭正在运转的memcached服务
-d install                  安装memcached服务
-d uninstall              卸载memcached服务
-u <username>       以<username>的身份运转 (仅在以root运转的时候有效)
-m <num>              最大内存运用,单位MB。默许64MB
-M                          内存耗尽时返回差错,而不是删除项
-c <num>                最大同时连贯数,默许是1024
-f <factor>              块大小增长因子,默许是1.25
-n <bytes>             最小分配空间,key+value+flags默许是48
-h                          显示帮忙

 Memcached也可以在控制台中增加键值对,首先运用下令“telnet 127.0.0.1 11211”进入到Memcached控制台,

然后运用set、add、replace、get、delete来操纵。

更细致操纵可参照这里

五、Memcached的优势和不够

说到Memcached的优势,那当然是:速度快,操纵简捷,易扩展

不够的话,主要有2点:

1.数据的临时性(数据仅保留在内存中)
2.只能通过指定键来读取数据,不支撑依稀查询

六、Memcached休止时的保障措施
要是数据库的访问量比较大,就需要提早做好预备,以便应答在memcached休止时产生的负载题目。

要是能在休止memcached以前,把数据复制到其他的server就好了。恩,这个可以通过repcached来实现。

repcached是小日本人开发的实现memcached复制功能,
它是一个单master、单slave的方案,但它的master/slave都是可读写的,而且可以彼此同步
要是master坏掉,slave侦测到连贯断了,它会主动listen而成为master

热门标签:dede模板 / destoon模板 / dedecms模版 / 织梦模板
责任编辑:UxO6T
打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有153人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助



订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板