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

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

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

一、准备工作
到http://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

(0)

相关推荐

  • thinkphp四种url访问方式详解

    本文实例分析了thinkphp的四种url访问方式.分享给大家供大家参考.具体分析如下: 一.什么是MVC thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行. M -Model 编写model类 对数据进行操作 V -View  编写html文件,页面呈现 C -Controller 编写类文件(UserAction.class.php) 二.ThinkPHP的MVC特点    (简单了解) 三.ThinkPHP的MVC对应的目录  (简单了解) M 项目目录/应用目录/Li

  • PHP+memcache实现消息队列案例分享

    memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志.然后通过定时程序将内容落地到文件或者数据库. php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问题,那么可以采取队列.方便实现队列的轻量级队列服务器是:starling支持memcache协议的轻量级持久化服务器https://github.com/starling/starlingBeanstalkd轻量.高效,支持持久化,每秒可处理3000左右的队列http://kr.gi

  • thinkphp中memcache的用法实例

    本文实例讲述了thinkphp中memcache的用法.分享给大家供大家参考.具体分析如下: 1.下载并安装memcache ① window下安装memcache. 下载memcached.exe 到d:/memcached/memcached.exe.在运行cmd 输入                d:/memcached/memcached.exe -d install安装 . ② 运行d:/memcached/memcached.exe -d start 启动memcache ③ 下载

  • ThinkPHP中__initialize()和类的构造函数__construct()用法分析

    本文实例分析了ThinkPHP中的__initialize()和类的构造函数__construct().分享给大家供大家参考.具体分析如下: thinkphp中的__construct是不可以随便用的,因为你的模块类继承上级类,上级类有定义好的; 1.__initialize()不是php类中的函数,php类的构造函数只有__construct(). 2.类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化.

  • php中用memcached实现页面防刷新功能

    有个新需求要加上去,防止用户频繁刷新页面.具体需求是当用户在一分钟之后内请求指定的页面超过100次,就直接拒绝请求.仔细分析后发现这个功能用memcache来做最方便: 1.以用户IP和被请求的文件名作为KEY值. 2.以memcached的方法increment()来自增记录用户访问次数,increment()是原子性增加,准确. 3.设置set()时指定过期时间为60s,这样就统计一分钟的访问次数. 于是写了个函数放在项目的初始化文件中调用,函数内容如下: function requestC

  • Memcached常用命令及使用说明

    一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下: <command name> set/add/replace <key> 查找关键字 <flags> 客户机使用它存储关于键值对的额外信息 <exptime> 该数据的存活时间,0表示永远 <bytes> 存储

  • ThinkPHP自动完成中使用函数与回调方法实例

    本文实例讲述了ThinkPHP自动完成中使用函数与回调方法.分享给大家供大家参考.具体方法如下: ThinkPHP 自动填充格式如下: 复制代码 代码如下: array(填充字段,填充内容[,填充条件][,附加规则]) 附加规则,可选,包括: string:字符串,表示填充内容为字符串(默认). function:使用函数,表示填充的内容是一个函数返回值. callback:使用方法,表示填充的内容是一个当前 Model 的方法返回值. field:字段,表示填充的内容是一个其他字段的值. Th

  • thinkPHP实现瀑布流的方法

    本文实例讲述了thinkPHP实现瀑布流的方法.分享给大家供大家参考.具体分析如下: 很多人都想做瀑布流的效果,这里告诉大家官网使用的方法,首先要下载瀑布流的插件jquery.masonry.min.js 地址:http://masonry.desandro.com/index.html里面包含的很多示例. 流程: 1. 页面初始化时,调用插件进行一次排版: 2. 当用户将滚动条拖到底部时,用ajax加载一次数据,并排版显示 3. 重复2,直到无数据 Html代码: 复制代码 代码如下: <!D

  • php扩展memcached和memcache的安装配置方法

    php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached是比较新的开发库,php安装这两个扩展中的任意一个后就可以在编写php代码时使用的memcached缓存数据,达到缓存php执行的结果 1.安装memcache tar -zxvf memcache-2.2.7.tgz cd memcache-2.2.7 /usr/local/php/bin/phpize ./configure –with-php-config=/usr/local

  • 修改ThinkPHP缓存为Memcache的方法

    一般来说,ThinkPHP的默认缓存方式是以File文件方式实现的,运行时会在/Runtime/Temp 下生成很多的缓存文件. 有的情况下服务器装了memcached之后,需要将ThinkPHP的缓存方式更改成memecache方式 具体操作步骤如下: 在Conf/config.php 中添加: 'DATA_CACHE_TYPE' => 'Memcache', 'MEMCACHE_HOST' => 'tcp://127.0.0.1:11211', 更新缓存后刷新页面发现缓存并没有生效. 得到

  • php中操作memcached缓存进行增删改查数据的实现代码

    核心代码: <?php //创建一个memcache对象实例 $memcache = new Memcache; if(!$memcache->connect("127.0.0.1",11211)){ die('连接失败'); } if($memcache->set('key1',"xian",MEMCACHE_COMPRESSED,60)){ echo 'sucess!'; }//存值,其中xian字符串,也可以为数组,对象,但不能为资源 $va

随机推荐