澳门新浦京8455comMemcached命令

澳门新浦京8455com 5

Memcached由Danga
Interactive开发,用来提升LiveJournal.com网站性能。Memcached分布式架构支持众多的社交网络应用,Twitter、Facebook还有Wikipedia。在接下来的两部分教程中,Sunil
Patil介绍了Memcached分布式哈希表架构,以及利用它帮助你为数据驱动Java企业应用做数据缓存。

首先讲一下Memcache和Memcached。

为什么会有Memcache和Memcached两种名称呢?其实Memcache是这个项目的名称,而Memcached是它服务器端的主程序文件名。

Memcache 的命令行用法:

本文介绍了如何利用Memcached提升Java企业应用性能。首先,总览了传统的Java缓存框架,并和Memcached做一个比较。当然,也会在你的本机上安装Memcached,如何通过telnet与Memcached交互工作。接着,创建一个”Hello
Memcached”Java客户端程序。你会了解如何利用Memcached减少数据库服务器负载,缓存动态生成的页面标记。最后,考虑对spymemcached客户端做一些高级优化配置。

什么是Memcached

Memcached是一种基于内存的key-value存储。它在内存里维护一个统一的巨大的hash表,用来存储各种格式的数据,包括图像、视频、文件以及数据库
检索的结果等。
Memcached通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

工作原理:

  1. 客户端第一次访问应用程序时,会到数据库(RDBMS)中取出数据,返回给客户端;同时也将取出的数据保存到Memcached中。
  2. 第二次访问时,因为数据已经缓存,不不用去数据库查询了,直接从Memcached取。

1、启动Memcache 常用参数

   memcached 1.4.3  
    -p <num>      设置端口号(默认不设置为: 11211)  
    -U <num>      UDP监听端口 (默认: 11211, 0 时关闭)  
    -l <ip_addr>  绑定地址
(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
 
    -d            独立进程运行
    -u <username> 绑定使用指定用于运行进程 <username>  
    -m <num>      允许最大内存用量,单位M (默认: 64 MB)  
    -P <file>    
将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d
一起使用
    如:
    在linux下:./usr/local/bin/memcached -d -u jb-mc -l 192.168.1.197 -m
2048 -p 12121
    在window下:d:App_Servmemcachedmemcached.exe -d RunService -l
127.0.0.1 -p 11211 -m 500
    在windows下注册为服务后运行:
    sc.exe create jb-Memcached binpath=
“d:App_Servmemcachedmemcached.exe -d RunService -p 11211 -m 500”
start= auto
    net start jb-Memcached

Memcached以及Java缓存架构总览

像Ehcache和OSCache这样的Java缓存框架,本质上是存在于应用代码中的HashMap对象。无论何时添加一个新的对象到缓存中,它都保存在你的应用内存中。保存少量数据时,这个策略是没有问题的,但缓存超过GB的数据就有问题了。Memcached服务器的设计者采用一种分布式架构,这种方式便于扩展,因此,可以利用Memcached做海量数据缓存。

Memcached架构包含两部分。首先是一个拥有自身进程的Memcached服务器软件。倘若你想扩展你的应用,可以在其它机器上运行Memcached服务器软件。Memcached服务器软件实例相互独立。Memcached系统的第二部分是Memcached客户端,它确切地知道每台服务器的存在。客户端负责获取缓存录入对应的服务器,以及存储或者获得缓存录入——这一过程,稍后我会做详细地讨论。

如果曾经开发过Java EE
网络应用,你一定用过EHCache或者OSCache之类的Java开源缓存框架。你或许用过DynaCache或者JBoss
Cache这样的商业缓存框架作为应用服务器的一部分。在我们亲手实践本教程之前,明白Memcached与那些传统Java缓存框架的不同之处是很重要的。

ubuntu下Memcached安装

由于Memcache是基于libevent的,所以确保你的系统已经装了libevent,libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。
由于memcached和libevent是由C编写的,所以首先确保你的系统安装了gcc。

sudo apt-get install libevent libevent-deve //安装libevent库
sudo apt-get install build-essential//安装 C/C++ 的编译环境 gtk libgtk2.0-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install memcached//安装 Memcached

2、连接:telnet 127.0.0.1 11211

   不要说不会用这个?

使用传统的Java缓存

无论选择开源或者是商业方案,使用传统Java缓存架构是很容易。使用类似EHCache或者OSCache这种开源的框架,你需要下载二进制文件,添加必须的JAR文件到你的应用classpath下。同样,你需要创建配置文件,配置缓存、交换分区的大小。由于缓存框架需要与软件绑定,而缓存框架通常会与应用服务器绑定,所以无需下载任何额外的JAR文件。

澳门新浦京8455com 1

图1 传统的Java缓存架构

在为你的应用程序添加缓存框架之后,通过创建CacheManager对象获取和设置其中的缓存条目(entry)。这样,你的应用和缓存框架创建的CacheManager会在相同的JVM上运行。每次增加缓存条目,此对象会添加到由缓存框架维护某类哈希表中。

一旦你的应用服务器软件运行在多个节点上,你可能需要支持分布式缓存。在分布式缓存系统中,一旦在AppServer1中添加了某个对象,在AppServer2和AppServer3上此对象也变为可用。传统的Java缓存使用复制(replication)实现分布式缓存,这意味着当你为AppServer1添加一个缓存条目,该条目会自动复制到系统的其它应用服务器上。最终,条目会在所有的站点中可用。

Memcached 连接

telnet 命令并指定主机ip和端口来连接 Memcached 服务。

telnet HOST PORT

澳门新浦京8455com 2

telnet写入memcache命令格式
<command name> <key> <flags> <exptime>
<bytes>rn <data block>rn

  1. <command name> 可以是”set”, “add”, “replace”
  2. <key> 保存数据的key
  3. <flags> 是一个16位的无符号的整数(以十进制的方式表示)。
  4. <exptime> 过期的时间。0表示存储的数据永远不过时
  5. <bytes> 需要存储的字节数 ,当用户希望存储空数据时,可以为0
  6. 最后客户端需要加上”rn”作为”命令头”的结束标志。

telnet响应命令

  1. STORED 表示存储成功
  2. NOT_STORED 表示存储失败,但是该失败不是由于错误
    其他操作命令方法同上

telnet 其他命令

  1. Stats 状态
  2. stats reset 清空统计数据
  3. Flush_all 清空数据
  4. Quit 退出telnet

3、写入memcache

  <command name> <key> <flags> <exptime>
<bytes>rn 

 <data block>rn

    a) <command name> 可以是”set”, “add”, “replace”。
   
“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
   
“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
   
“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败

    b) <key> 客户端需要保存数据的key。

    c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。
    该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
    客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。

    d) <exptime> 过期的时间。
    若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
   
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。

    e) <bytes>
需要存储的字节数(不包含最后的”rn”),当用户希望存储空数据时,<bytes>可以为0

    f) 最后客户端需要加上”rn”作为”命令头”的结束标志。
    <data block>rn

   
紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”rn”作为此次通讯的结束。
    结果响应:reply
    当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:

    a) “STOREDrn”:表示存储成功
    b) “NOT_STOREDrn” : 表示存储失败,但是该失败不是由于错误。
   
通常这是由于”add”或者”replace”命令本身的要求所引起的,或者该项在删除队列之中。

   如: set key 33 0 4rn(回车)

        ffffrn(回车)

     显示:stored

使用Memcached

要使用Memcached进行缓存,必须下载并在你的平台上安装Memcached服务器软件。一旦Memcached服务器安装成功,它会通过TCP或者UDP端口监听缓存调用。

澳门新浦京8455com 3

图2 Memcached架构

接着,下载一个JavaMemcached客户端,把客户端JAR文件添加到你的应用中。然后创建一个Memcached客户端对象,就可以调用它的方法获取和设置缓存条目。一旦添加某个对象到缓存中,Memcached客户端会获取该对象、对其序列化并发送字节数组到Memcached服务端保存。这时,缓存对象可能被应用运行的JVM作为垃圾回收。

当你需要缓存对象时,可以调用Memcached客户端的 get()
方法。客户端会得到这个get请求、序列化并将get请求传给Memcached服务器。Memcached服务器通过该请求从缓存中查找这个对象。如果存有此对象,服务器会把这个字节数组返回给客户端。客户端收到字节数组,反序列化并创建对象返回给你的应用。

即使你的应用跑在不止一个应用服务器上,所有的应用都能指向相同的Memcached服务器,通过它获取并设置缓存条目。倘若你拥有不止一台Memcached服务器,服务器互相之间不会知道。因此,你需要配置Memcached客户端,这样它就能知道所有Memcached服务器。比如,应用在AppServer1创建一个Java对象,接着调用Memcached的
set()
方法,Memcached客户端就找到某个Memcached服务器来存放条目。接着它只和此台Memcached服务器通信。同样,一旦存在于AppServer2或者Appserver3的代码尝试去获取某个录入时,Memcached客户端首先会找出哪个服务器存储了此条目,接着只与此服务器通信。

Memcached 运行
memcached -p 11211 -m 64m -d

启动了memcached,监听TCP端口11211,最大内存使用量为64M。
启动Memcached 常用参数
-d是启动一个守护进程;
-m是分配给Memcache使用的内存数量,单位是MB;
-u是运行Memcache的用户;
-l是监听的服务器IP地址,可以有多个地址;
-p是设置Memcache监听的端口,,最好是1024以上的端口;
-c是最大运行的并发连接数,默认是1024;
-P是设置保存Memcache的pid文件。

4、获取/检查KeyValue

    get <key>*rn
    a) <key>* 表示一个或者多个key(以空格分开)
    b) “rn” 命令头的结束

    结果响应:reply
   
服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到”ENDrn”
    每一项的数据结构:
    VALUE <key> <flags> <bytes>rn
    <data block>rn

    a) <key> 希望得到存储数据的key
    b) <falg> 发送set命令时设置的标志项
    c) <bytes> 发送数据块的长度(不包含”rn”)
    d) “rn” 文本行的结束标志
    e) <data block> 希望接收的数据项。
    f) “rn” 接收一个数据项的结束标志。

   
如果有些key出现在get命令行中但是没有返回相应的数据,这意味着服务器中不存在这些项,这些项过时了,或者被删除了
    如:get aa
    VALUE aa 33 4
    ffff
    END

Memcached客户端逻辑

在缺省状态下,Memcached客户端使用非常简单的逻辑选择服务器进行get或set操作。一旦调用get()或者set(),客户端就会得到缓存键(key)调用hashcode()方法得到整数值,比如11。接着用这个数除以Memcached服务器可用数量(比如2),本例中得到的余数为1。缓存条目就会指向Memcached服务器1。这个简单的算可以确保应用服务器所在的Memcached客户端为给定的缓存键选择相同的服务器。

Java 连接 Memcached 服务

在学习中我使用了两种驱动jar包

import java.net.InetSocketAddress;
import net.spy.memcached.MemcachedClient;

public class M {

    public static void main(String[] args) {
        try{       
             MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));  // 本地连接 Memcached 服务
             System.out.println("Connection to server sucessful.");           
             mcc.shutdown();       // 关闭连接     
          }catch(Exception ex){
             System.out.println( ex.getMessage() );
          }
    }
}


运行结果:
2016-08-10 18:50:33.404 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue
Connection to server sucessful.
2016-08-10 18:50:33.409 INFO net.spy.memcached.MemcachedConnection:  Shut down memcached client

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemcachedJava {
    public static void main(String[] args) {
        //初始化SockIOPool,管理Memcached的连接池
        String[] server = { "127.0.0.1:11211" };
        SockIOPool pool = SockIOPool.getInstance();//获取sock连接池的实例对象  
        pool.setServers(server);
        pool.setFailover(true);
        pool.setInitConn(10); //设置初始连接数
        pool.setMinConn(5);//最小连接数
        pool.setMaxConn(250);//最大连接数
        pool.setMaintSleep(30);
        pool.setNagle(false);
        pool.setSocketTO(3000);
        pool.setAliveCheck(true);
        pool.initialize();
        try{
             // 本地连接 Memcached 服务
             MemCachedClient mcc = new MemCachedClient();
             System.out.println("Connection to server sucessful.");
            // mcc.add("frady", "this is a test");  
             //System.out.println(mcc.get("frady"));             
          }catch(Exception ex){
             System.out.println( ex.getMessage() );
          }
    }
}

运行结果:
Connection to server sucessful.

具体的Memcached命令可以参见
Memcached
教程–菜鸟教程

5、删除KeyValue:

    delete <key> <time>rn

    a) <key> 需要被删除数据的key
    b) <time>
客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)
    c) “rn” 命令头的结束

Memcached安装

Memcached可以运行在Unix、Linux、windows以及MacOSX上。你可以下载Memcached源码编译,或者直接下载编译好的二进制文件安装Memcached。这里我会展示为特定平台下载二进制文件的安装过程。如果你更倾向于编译,请参见这里。

接下来的安装指令针对Windows XP
32位机器,若平台是linux等其它平台,查看这里。注意本文案例代码是在Windows
XP 32位机器上开发的,不过是可以在其它平台上运行。

  1. Jellycan
    code是一个Memcached修订版本,更易用更有效,我们先从下载win32二进制压缩文件开始。
  2. 解压Memcached-<versionnumber>-win32-bin.zip,注意里面包含memcached.exe,执行此文件完成服务器搭建。
  3. 使用 memcached.exe -d install
    注册memcached.exe作为系统服务,你可以在服务控制台开启或者停止Memcached服务器。

当你在缺省状态下执行memcached.exe,Memcached服务器默认占用64兆内存,监听11211端口。在某些情形下,或许你想做一些更加细粒度的控制。比如,端口11211被本机其他进程占用,你希望Memcached可以监听端口12000;或者你想在质量保证或者生产环境中搭建Memcached服务器,需要的默认内存不止64兆。你可以通过命令行参数定制服务器行为。运行memcache.exe
-help命令会获取所有的命令行选项,如下图3所示。

澳门新浦京8455com 4

图3 Memcached服务器命令行选项

6、检查Memcache服务器状态:

   statsrn
 
 在这里可以看到memcache的获取次数,当前连接数,写入次数,已经命中率等;

    pid : 进程id
    uptime :总的运行时间,秒数
    time : 当前时间
    version : 版本号
    ……
    curr_items : 当前缓存中的KeyValue数量
    total_items : 曾经总共经过缓存的KeyValue数量
    bytes : 所有的缓存使用的内存量
    curr_connections 当前连接数
    ….
    cmd_get : 总获取次数
    cmd_set : 总的写入次数
    get_hits : 总的命中次数
    miss_hits :  获取失败次数
    …..
    bytes_read : 总共读取的流量字节数
    bytes_written : 总的写入流量字节
    limit_maxbytes : 最大允许使用的内存量,字节

通过Telnet与Memcached交互

一旦Memcached服务器开始监听你指定的端口,Memcached客户端就可以通过TCP或者UDP端口与之连接,发送命令或者接受响应,最后关闭连接。

连接Memcached服务器方式有多种,我会在本教程的第二部分采用Java客户端连接,你将能够利用简单的API从缓存中存储或者获取对象。或者你可以采用Telnet客户端直接与服务器连接。懂得利用Telnet客户端与Memcached服务器交互对调试Java客户端很重要,因此我们就从这里开始。

7、高级缓存细节查看方法:

   stats reset
   清空统计数据

    stats malloc
    显示内存分配数据

    stats cachedump slab_id limit_num
    显示某个slab中的前limit_num个key列表,显示格式如下
    ITEM key_name [ value_length b; expire_time|access_time s]
    其中,memcached 1.2.2及以前版本显示的是  访问时间(timestamp)
    1.2.4以上版本,包括1.2.4显示 过期时间(timestamp)
    如果是永不过期的key,expire_time会显示为服务器启动的时间

    stats cachedump 7 2
    ITEM copy_test1 [250 b; 1207795754 s]
    ITEM copy_test [248 b; 1207793649 s]

    stats slabs
    显示各个slab的信息,包括chunk的大小、数目、使用情况等

    stats items
   
显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)

    stats detail [on|off|dump]
    设置或者显示详细操作记录

    参数为on,打开详细操作记录
    参数为off,关闭详细操作记录
    参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

Telnet命令

首先你需要用Telnet客户端连接Memcached服务器。在WindowsXP平台上,如果Memcached服务器也运行在这台机器上并缺省监听端口11211,只要执行telnet
localhost 11211。接下来的命令对Telnet管理Memcached很重要:

  • set添加一个新的项目到缓存中,使用格式是 Set <keyName>
    <flags> <expiryTime>
    <bytes>,你可以将敲入的值存入下一行。倘若不想缓存录入过期,可以输入0。
  • get返回缓存键的值,调用get <keyName>获得keyName的值。
  • add添加一个新的键,前提是此键之前并不存在,比如add <keyName>
    <flags> <expiryTime> <bytes>。
  • replace会替代某个键的值,前提是此键已存在,比如replace
    <keyName> <flags> <expiryTime> <bytes>。
  • delete删除某个键的缓存录入,调用delete
    <keyName>删除keyName的值。

图4的截图展示了通过Telnet与Memcached服务器交互案例。正如你所看到的,Memcached服务器会对每个命令做出回应,比如STORED、NOT_STORED等。

澳门新浦京8455com 5

图4 Telnet客户端与Memcached服务器交互案例

8、清空所有键值 

   flush_all
 
 注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。

第一部分结语

到此,我们简要地讨论了Memcached分布式框架和众多传统Java缓存系统。在你的开发环境中安装了Memcached,通过Telnet连接Memcached。教程的下一篇中,我们将调用Java客户端sypmemcached命令,为一个Java示例应用建立分布式缓存方案。在此过程中,你会了解更多关于Memcached的信息,以及如何提升你的JavaEE应用性能。

9、退出

   quitrn 

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图