zoukankan      html  css  js  c++  java
  • memcache基本讲解

    Memcached技术

    介绍:

    memcached是一种缓存技术他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速,

    memachec 中维护了一张大的hashtable表 ,该表是在内存,表的结构是

    key    value

    字串  (字串,数值,数组,对象,布尔,二进制数据,null

    原理说明:

     

    u 安装并使用memcached

    安装步骤

    (1) 下载memcached软件

    (2) 安装

    进入cmd ,切换到 memcached.exe 文件所在目录

    memcached.exe –d install

    (3) 启动memcached

    第一种,可以到服务点击启动

    第二种命令行

    memcached.exe –m 200MB –d start  【以deamon方式启动,默认64M

    如果你在启动时,win7启动不成功则可以使用如下方法

    memcached.exe –p 端口号

    启动方法不要关闭控制台.

    端口号的范围 : 0-65535  , 因为端口号是用两个字节来表示

    有名端口: 0-1024 已经用程序使用 , apache 80  , mysql 3306 , ftp 21 , ssh 22

    oracle: 1521, stmp: 25 

    使用netstat –an 如果看到 11211端口在监听,说明启动ok

    netstat –anb 是哪个程序监听这个指令还可以看到有哪些用户连接到我们的服务器.

    如果没有安装好,原因可能

    1. 如果你是win7, win7对安全性高,所有,必须以adminstartor 身份来安装.

    你切换成adminstrator , 去安装,在启动

    1. 你的memcached.exe 目录有中文,或特殊字符保证目录没有中文和特殊字符.

    (4) 准备研究如果对memcached进行curd操作.

     

    看看telnet如何操作 (curd

    1. 登录到telnet连接到 memcached服务

    telnet 127.0.0.1  11211

    如果你们不能使用telnet 是因为系统不存在 telnet.exe , 就可以到其它机器上拷贝 telnet.exe 放在 c:windowssystem32 即可

    1. 增加

    基本语法是:

    add key名 存放时间(数据大小(字符)

    举例:

    add key1 0 30 5

    1. 如何获取

    基本语法是:

    get key

    get key1

    1. 修改

    set key名 存放时间 数据大小.

    举例:

    set key1 0 40 5

    ☞ 如果key1不存在,则相当于增加新,如果存在,则相当有替换

    replace key名 存放时间 数据大小

    replace key1 0 40 5

    ☞ 如果key1不存在,则失败,这个指令要求key必须存在.

    1. 删除

    基本语法是

    delete key

    比如

    delete key1

    append

    Append data to existing key

    append key 0 60 15

    prepend

    Prepend data to existing key

    prepend key 0 60 15

    flush_all 可以统一把数据清空.

     

    这里主要大家可以去计算出命中率 cmd_hits/cmd_get . 越高越好.

    u 如何使用php程序操作我们的memcached服务 curd.

    步骤,准备工作.

    (1) 把 php_memcache.dll 文件拷贝 phpext 

    ☞ 不同版本的php 所使用的 php_memcache.dll 的版本不一样

    (2) 修改php.ini文件,加载 php_memcache.dll (该文件就是封装了一堆函数)

    ;加载php_memcache.dll 文件

    extension=php_memcache.dll

    (3) 重新启动apache

    (4) 我们写程序来完成curd操作.

    细节在我们添加数据的时候,如果 

    bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )

    如果报 expire 设为表示,永不过期.(只要memcache不重新启动,就永远在mem)

    exprie 直接给的是秒数,则最大 30*3600*24

    如果你希望保持时间超过30  time()+天数*3600*24 即可

    最后代码:

    mem1.php 

    <?php

        //创建一个mem对象实例

    $mem=new Memcache;

         

    if(!$mem->connect("127.0.0.1",11211)){

    die('连接失败!');

    }

    //增加

    //1.增加一个字串

    /* if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){

    echo '添加ok';

    }*/

    //2.添加数值

    /* if($mem->set('key1',100,MEMCACHE_COMPRESSED,60)){

    echo '添加ok';

    }*/

    //3.添加数组

    //在添加数组是,根据需要希望序列号放入  ,

    //serialize<=>unserialize, 如果根据需要,也可以json_encode <=> json_decode

    $arr=array("bj",'tj');

    if($mem->set('key1',$arr,MEMCACHE_COMPRESSED,time()+31*3600*24)){

    echo '添加数组ok99111';

    }

    //4.添加对象

    /* class Dog{

    public $name;

    public $age;

    public function __construct($name,$age){

    $this->name=$name;

    $this->age=$age;

    }

    }

    $dog1=new Dog('小狗',50);

    if($mem->set('key1',$dog1,MEMCACHE_COMPRESSED,60)){

    echo '添加对象ok';

    }*/

    //5.添加null 布尔值

    /* if($mem->set('key1',false,MEMCACHE_COMPRESSED,60)){

    echo '添加布尔ok';

    }*/

    //6. 资源类型放入.

    /* $con=mysql_connect("127.0.0.1","root","root");

    if(!$con){

    die('连接数据库失败');

    }

    var_dump($con);

    echo "<br/>";

    if($mem->set('key1',$con,MEMCACHE_COMPRESSED,60)){

    echo '添加资源ok';

    }*/

    //查询

    $val=$mem->get('key1');

    var_dump($val);

    //修改

    //可以使用replace

    if($mem->replace("key11",'hello',MEMCACHE_COMPRESSED,60)){

    echo 'replace ok';

    }else{

    echo 'replace no ok';

    }

    //删除

    echo "<br/>";

    if($mem->delete('key14')){

    echo 'key14 删除';

    }else{

    echo 'key14不存在';

    }

    mem2.php

    <?php

    //这个文件去操作memcached服务

     //创建一个mem对象实例

    $mem=new Memcache;

         

    if(!$mem->connect("127.0.0.1",11211)){

    die('连接失败!');

    }

    //在另外文件中取出对象时,有个注意的地方,对应php5.2这个版本会提示错误,

    //php5.3这个版本会提示 incomplete 信息解决方法是声明类定义即可

    class Dog{

    public $name;

    public $age;

    public function __construct($name,$age){

    $this->name=$name;

    $this->age=$age;

    }

    }

    $dog=$mem->get('key1');

    var_dump($dog);

    test.php 说明serilize 和 json_encode用法:

    //什么时候使用serilize 什么时候使用json_encode [ajax配合]

    练习请大家使用php 程序 memcache.dll 完成对memcahce增删改查

    20min 

    u 如何使用PHP源码来操作memcached服务

    如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作.

    关闭扩展.

    代码mem3.php

    <?php

     require_once 'memcached-client.php';

      

      $mc = new memcached(array(

                   'servers' => array('127.0.0.1:11211'), //连接的memcacheip和端口

                   'debug'   => false, //是否debug

                   'compress_threshold' => 10240, /*最大压缩*/

                   'persistant' => true)); /*是否是持久连接*/

      $mc->set('key1', array('some', 'array'));

     // $mc->replace('key', 'some random string');

      $val = $mc->get('key1');

    var_dump($val);

    //修改

    $mc->replace('key1', "北京");

    $val = $mc->get('key1');

    var_dump($val);

    //删除

    $mc->delete('key1');

      $val = $mc->get('key1');

    echo "删除后";

    var_dump($val);

    u Memcached 机制的深入了解

    ③ , memcache的数据是放入到内存,并且在数据爆满的情况下,使用LRU 算法删除

    写段代码说明: mem4.php

    mem5.php 取出.

    总结:

    1. mem服务的数据不是同步数据是分布的
    2. 把什么数据放入到哪个memcached是由客户端的mem对象决定
    3. 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销

    u memcache的细节讨论

    ① 生命周期

    从数据放入mem开始计时,直到时间到了,就销毁如果时间为0, 则表示不过期.

    memcache的数据被销毁的情况如下:

    1. 时间到
    2. 重启memcached服务
    3. 重启memcached服务所在的机器
    4. delete / flush 销毁数据

    ② 如何把session数据放入到memcached服务中.

    步骤:

    1. 修改php.ini的配置文件

    如下:

    ;[sesson.save_handler user|files|memcache]

    session.save_handler = memcache

    session.save_path = "tcp://127.0.0.1:11211"

    ③ 测试一把,重启apache

    测试ok 

    <?php

    //传统的代码

    session_start();

    $_SESSION['name']='天龙八部300';

    $_SESSION['city']='beijing';

    class Dog{

    public $name;

    }

    $dog1=new Dog;

    $dog1->name='abcde';

    $_SESSION['dog']=$dog1;

    //如果session数据入mem,那他一定是以session_id

    //key值进行添加

    //取出

    $name=$_SESSION['name'];

    echo "name=$name";

    echo "sessionid=".session_id();

    u 思考,如果管理员,不让我们修改 php.ini 文件,我们如何处理sessionmemcached这个功能我们通过一个函数可以去修改 php.ini 的配置.

    代码:

    <?php

    ini_set("session.save_handler","memcache");

    ini_set("session.save_path","tcp://127.0.0.1:9999");

    同时你也可以通过 ini_set 去动态的修改对php.ini 的其它设置 。但是他不影响其它php页面,也不会去修改php.ini 文件本身只对本页面生效.

    u memcached vs session比较

    memcached 主要的目的是提速 ,因此它是一种无状态的数据.即,数据不和用户绑定.

    session数据是和绑定的,因此是一种有状态数据.

    u memached安全性

    如何使用memcached 服务才是安全的.

    windows下通过启用防火墙来保护我们的memcached,原理图:

    linux 也可以使用防火墙.

    setup 配置防火墙

    iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT

    u 什么样的数据适合放入memcached?

    memcached技术类似是redis (key/value数据库)

    课后练习:

    这个这个

    这个练习主要是让大家去练习crud的操作.

    详细讲解:http://blog.csdn.net/pi9nc/article/details/17317231

    初始化:memcache 

    static {  
            String[] serverlist = { "server1.com:port", "server2.com:port" };  
       
            SockIOPool pool = SockIOPool.getInstance();  
            pool.setServers(serverlist);  
            pool.initialize();  
     }
    

      创建一个client对象: 

    MemCachedClient mc = new MemCachedClient(); 
    

      创建一个缓存: 

    MemCachedClient mc = new MemCachedClient();  
     String key = "cacheKey1";  
     Object value = SomeClass.getObject();  
     mc.set(key, value);  
    

      通过key删除一个缓存: 

    MemCachedClient mc = new MemCachedClient();  
     String key = "cacheKey1";  
     mc.delete(key);
    

      通过key获取缓存对象: 

    MemCachedClient mc = new MemCachedClient();  
     String key = "key";  
     Object value = mc.get(key);  
    

      获取多个缓存对象: 

    MemCachedClient mc = new MemCachedClient();  
     String[] keys = { "key", "key1", "key2" };  
     Map<Object> values = mc.getMulti(keys); 
    

      刷新全部缓存: 

    MemCachedClient mc = new MemCachedClient();  
     mc.flushAll(); 
    

      

    七、            Memcached客户端程序

    Memcached的java客户端已经存在三种了:

    ?  官方提供的基于传统阻塞io由Greg Whalin维护的客户端

    ?  Dustin Sallings实现的基于java nio的Spymemcached

    ?  XMemcached


    1. 三种API比较 
    1)      memcached client for java

    较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。


    2)      spymemcached

    A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。


    3)      xmemcached

    XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。


    2.  建议

    由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。

    XMemcached也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集成、客户端连接池、可扩展性好等。

    下面给出这三种客户端的示例程序。


    3.  示例程序
    1)      memcached client for java

    从前面介绍的Java环境的Memcached客户端程序项目网址里,下载最新版的客户端程序包:java_memcached-release_2.5.1.zip,解压后,文件夹里找到java_memcached-release_2.5.1.jar,这个就是客户端的JAR包。将此JAR包添加到项目的构建路径里,则项目中,就可以使用Memcached了。

    示例代码如下:

    package temp;
    
     
    
    import com.danga.MemCached.*;
    
    import org.apache.log4j.*;
    
     
    
    public class CacheTest {
    
        public static void main(String[] args) {
    
           /**
    
            * 初始化SockIOPool,管理memcached的连接池
    
            * */
    
           String[] servers = { "10.11.15.222:10000" };
    
           SockIOPool pool = SockIOPool.getInstance();
    
           pool.setServers(servers);
    
           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();
    
          
    
           /**
    
            * 建立MemcachedClient实例
    
            * */
    
           MemCachedClient memCachedClient = new MemCachedClient();
    
           for (int i = 0; i < 1000; i++) {
    
               /**
    
                * 将对象加入到memcached缓存
    
                * */
    
               boolean success = memCachedClient.set("" + i, "Hello!");
    
               /**
    
                * 从memcached缓存中按key值取对象
    
                * */
    
               String result = (String) memCachedClient.get("" + i);
    
               System.out.println(String.format("set( %d ): %s", i, success));
    
               System.out.println(String.format("get( %d ): %s", i, result));
    
           }
    
        }
    
    }
    

      2)      spymemcached

    spymemcached当前版本是2.5版本,官方网址是:http://code.google.com/p/spymemcached/。可以从地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar下载最新版本来使用。

    示例代码如下:

    package temp;
    
     
    
    import java.net.InetSocketAddress;
    
    import java.util.concurrent.Future;
    
     
    
    import net.spy.memcached.MemcachedClient;
    
     
    
    public class TestSpyMemcache {
    
        public static void main(String[] args) {
    
           // 保存对象
    
           try {
    
               /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */
    
               MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));
    
               Future<Boolean> b = null;
    
               /* 将key值,过期时间(秒)和要缓存的对象set到memcached中 */
    
               b = mc.set("neea:testDaF:ksIdno", 900, "someObject");
    
               if (b.get().booleanValue() == true) {
    
                  mc.shutdown();
    
               }
    
           } catch (Exception ex) {
    
               ex.printStackTrace();
    
           }
    
           // 取得对象
    
            try {
    
               /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */
    
               MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));
    
               /* 按照key值从memcached中查找缓存,不存在则返回null */
    
               Object b = mc.get("neea:testDaF:ksIdno");
    
               System.out.println(b.toString());
    
               mc.shutdown();
    
           } catch (Exception ex) {
    
               ex.printStackTrace();
    
           }
    
        }
    
    }
    

      3)      xmemcached

    Xmemcached的官方网址是:http://code.google.com/p/xmemcached/,可以从其官网上下载最新版本的1.2.4来使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz

    示例代码如下:

    package temp;
    
     
    
    import java.io.IOException;
    
    import java.util.concurrent.TimeoutException;
    
     
    
    import net.rubyeye.xmemcached.utils.AddrUtil;
    
    import net.rubyeye.xmemcached.MemcachedClient;
    
    import net.rubyeye.xmemcached.MemcachedClientBuilder;
    
    import net.rubyeye.xmemcached.XMemcachedClientBuilder;
    
    import net.rubyeye.xmemcached.exception.MemcachedException;
    
     
    
    public class TestXMemcache {
    
        public static void main(String[] args) {
    
           MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil
    
                  .getAddresses("10.11.15.222:10000"));
    
           MemcachedClient memcachedClient;
    
           try {
    
               memcachedClient = builder.build();
    
          
    
               memcachedClient.set("hello", 0, "Hello,xmemcached");
    
               String value = memcachedClient.get("hello");
    
               System.out.println("hello=" + value);
    
               memcachedClient.delete("hello");
    
               value = memcachedClient.get("hello");
    
               System.out.println("hello=" + value);
    
               // close memcached client
    
               memcachedClient.shutdown();
    
           } catch (MemcachedException e) {
    
               System.err.println("MemcachedClient operation fail");
    
               e.printStackTrace();
    
           } catch (TimeoutException e) {
    
               System.err.println("MemcachedClient operation timeout");
    
               e.printStackTrace();
    
           } catch (InterruptedException e) {
    
               // ignore
    
           }catch (IOException e) {
    
               System.err.println("Shutdown MemcachedClient fail");
    
               e.printStackTrace();
    
           }
    
        }
    
    }
    

      

    (八)  64位机器安装Memcache
    1.   安装

    在64位的机器上安装Memcache和在32位的机器上安装的操作是一样的。在安装的过程中,可以使用如下的命令来查看安装是否成功,以进行确认。

    1)   确认libevent安装

    查看libevent是否安装成功:

    # ls -al /usr/lib | grep libevent

    在命令行出现如下信息,表明安装成功:

       lrwxrwxrwx   1 root root     21 Mar 22 18:41 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3

       -rwxr-xr-x   1 root root 262475 Mar 22 18:41 libevent-1.2.so.1.0.3

       -rw-r--r--   1 root root 430228 Mar 22 18:41 libevent.a

       -rwxr-xr-x   1 root root    811 Mar 22 18:41 libevent.la

       lrwxrwxrwx   1 root root     21 Mar 22 18:41 libevent.so -> libevent-1.2.so.1.0.3

    2)   确认memcache安装

    查看memcache是否安装成功:

    # ls -al /usr /bin/mem*

    在命令行出现如下信息,表明安装成功:

       -rwxr-xr-x  1 root root 114673 Mar 22 18:52 /usr/local/src/memcached

       -rwxr-xr-x  1 root root 120092 Mar 22 18:52 /usr/local/src/memcached-debug

    2.   64位的问题及修复
    1)   问题

    安装完成了,现在我们看一下memcache的帮助:

    #/usr/local/src/memecached -h

    这时候出现了如下错误:

       memcached: error while loading shared libraries: libevent-1.2.so.1: cannot open shared    object file: No such file or directory

    2)   修复

    下面说下修复过程:

    #LD_DEBUG=libs memcached -v #查看memcached的libs的路径

    在命令上出现了如下信息:

    5427:     find library=libevent-1.2.so.1 [0]; searching

    5427:      search cache=/etc/ld.so.cache

    5427: search        path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:

    /usr/lib64              (system search path)

    5427:       trying file=/lib64/tls/x86_64/libevent-1.2.so.1

    5427:       trying file=/lib64/tls/libevent-1.2.so.1

    5427:       trying file=/lib64/x86_64/libevent-1.2.so.1

    5427:       trying file=/lib64/libevent-1.2.so.1

    5427:       trying file=/usr/lib64/tls/x86_64/libevent-1.2.so.1

    5427:       trying file=/usr/lib64/tls/libevent-1.2.so.1

    5427:       trying file=/usr/lib64/x86_64/libevent-1.2.so.1

    5427:       trying file=/usr/lib64/libevent-1.2.so.1

    5427:            memcached: error while loading shared libraries: libevent-1.2.so.1: cannot open shared object file: No such                   file or directory

    现在应该记录下来libs的位置,我选择的是trying file=/usr/lib64/libevent-1.2.so.1,现在我们利用这个来做个符号链接:

    # ln -s /usr/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2

    下面我们继续使用memcached -h做下测试,终于出现了如下信息:

        memcached 1.2.0

        -p <num>      port number to listen on

        -s <file>     unix socket path to listen on (disables network support)

        -l <ip_addr>  interface to listen on, default is INDRR_ANY

        -d            run as a daemon

        -r            maximize core file limit

        -u <username> assume identity of <username> (only when run as root)

        -m <num>      max memory to use for items in megabytes, default is 64 MB

        -M            return error on memory exhausted (rather than removing items)

        -c <num>      max simultaneous connections, default is 1024

        -k            lock down all paged memory

        -v            verbose (print errors/warnings while in event loop)

        -vv           very verbose (also print client commands/reponses)

        -h            print this help and exit

        -i            print memcached and libevent license

        -b            run a managed instanced (mnemonic: buckets)

        -P <file>     save PID in <file>, only used with -d option

        -f <factor>   chunk size growth factor, default 1.25

        -n <bytes>    minimum space allocated for key+value+flags, default 48

    说明memcached安装成功。(应该是机器是64位的原因,所以将so文件放到了lib64下面,而不是lib下面,使得memcached找不到了so文件)。

    下面,我们来启动一个Memcached的服务器端:

    # /usr/local/src/memcached -d -m 10  -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

    (九)    Windows下的Memcache安装
    1.  安装

    在这里简单介绍一下Windows下的Memcache的安装:

    1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:memcached

    2. 在终端(也即cmd命令界面)下输入‘c:memcachedmemcached.exe -d install’安装

    3. 再输入:‘c:memcachedmemcached.exe -d start’启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。


    2.  memcached的基本设置

    ?  -p 监听的端口

    ?  -l 连接的IP地址, 默认是本机

    ?  -d start 启动memcached服务

    ?  -d restart 重起memcached服务

    ?  -d stop|shutdown 关闭正在运行的memcached服务

    ?  -d install 安装memcached服务

    ?  -d uninstall 卸载memcached服务

    ?  -u 以的身份运行 (仅在以root运行的时候有效)

    ?  -m 最大内存使用,单位MB。默认64MB

    ?  -M 内存耗尽时返回错误,而不是删除项

    ?  -c 最大同时连接数,默认是1024

    ?  -f 块大小增长因子,默认是1.25

    ?  -n 最小分配空间,key+value+flags默认是48

    ?  -h 显示帮助


    3.  设置Memcache缓存大小和端口

    Memcache的默认启动时的参数可能不满足实际生产环境的需要,于是就想到直接修改windows服务的启动参数,操作如下:

    打开注册表,找到:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesmemcached Server

    其中的ImagePath项的值为: c:memcachedmemcached.exe" -d runservice

    改成:c:memcachedmemcached.exe" -p 12345 -m 128 -d runservice

    其中,-p就是端口,-m就是缓存大小,以M为单位。

    在CentOS 5.6上编译安装Memcached

    1、由于memcached是基于libevent的,因此需要安装libevent,libevent-devel

    view plain   copy
    1. # yum install libevent libevent-devel -y 

    2、下载并解压memcached-1.4.5

    memcached官方网站是:http://memcached.org/

    view plain   copy
    1. # cd /root 
    2. # wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz 
    3. # tar -xvzf  memcached-1.4.5.tar.gz 

    3、编译安装memcached-1.4.5

    view plain   copy
    1. # cd memcached-1.4.5 
    2. # ./configure --prefix=/etc/memcached 
    3. # make 
    4. # make install 

    4、配置环境变量

    进入用户宿主目录,编辑.bash_profile,为系统环境变量LD_LIBRARY_PATH增加新的目录,需要增加的内容如下:

    # vi .bash_profile

    view plain   copy
    1. MEMCACHED_HOME=/etc/memcached 
    2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MEMCACHED_HOME/lib 

    刷新用户环境变量:# source .bash_profile

    5、编写memcached服务启停脚本

    # cd /etc/init.d

    vi memcached,脚本内容如下:

    #!/bin/sh 
    # 
    # Startup script for the server of memcached 
    # 
    # processname: memcached 
    # pidfile: /etc/memcached/memcached.pid 
    # logfile: /etc/memcached/memcached_log.txt 
    # memcached_home: /etc/memcached 
    # chkconfig: 35 21 79 
    # description: Start and stop memcached Service 
     
    # Source function library 
    . /etc/rc.d/init.d/functions 
     
    RETVAL=0 
     
    prog="memcached" 
    basedir=/etc/memcached 
    cmd=${basedir}/bin/memcached 
    pidfile="$basedir/${prog}.pid" 
    #logfile="$basedir/memcached_log.txt" 
     
    # 设置memcached启动参数 
    ipaddr="192.168.1.201"          # 绑定侦听的IP地址 
    port="11211"                    # 服务端口 
    username="root"                 # 运行程序的用户身份 
    max_memory=64                   # default: 64M | 最大使用内存 
    max_simul_conn=1024             # default: 1024 | 最大同时连接数 
    #maxcon=51200 
    #growth_factor=1.3              # default: 1.25 | 块大小增长因子 
    #thread_num=6                   # default: 4 
    #verbose="-vv"                  # 查看详细启动信息 
    #bind_protocol=binary           # ascii, binary, or auto (default) 
     
    start() { 
        echo -n $"Starting service: $prog" 
        $cmd -d -m $max_memory -u $username -l $ipaddr -p $port -c $max_simul_conn -P $pidfile 
        RETVAL=$? 
        echo 
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog 
    } 
     
    stop() { 
        echo -n $"Stopping service: $prog  " 
        run_user=`whoami` 
            pidlist=`ps -ef | grep $run_user | grep memcached | grep -v grep | awk '{print($2)}'` 
            for pid in $pidlist 
            do 
    #           echo "pid=$pid" 
                kill -9 $pid 
                if [ $? -ne 0 ]; then 
                    return 1 
                fi 
            done 
        RETVAL=$? 
        echo 
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog 
    } 
     
    # See how we were called. 
    case "$1" in 
        start) 
            start 
            ;; 
        stop) 
            stop 
            ;; 
        #reload) 
        #    reload 
        #    ;; 
        restart) 
            stop 
            start 
            ;; 
        #condrestart) 
        #    if [ -f /var/lock/subsys/$prog ]; then 
        #        stop 
        #        start 
        #    fi 
        #    ;; 
        status) 
            status memcached 
            ;; 
        *) 
            echo "Usage: $0 {start|stop|restart|status}" 
            exit 1 
    esac 
     
    exit $RETVAL 
    

      

    设置脚本可被执行:# chmod +x memcached

    6、设置memcached随系统启动

    # chkconfig --add memcached 
    # chkconfig --level 35 memcached on 
    

      

    启动memcached

    # service memcached start 
    //启动的时候实际上是调用了下面的这个命令,以守护进程的方式来启动memcached  
    /etc/memcached/bin/memcached -d -m 64 -u root -l 192.168.1.201  
    -p 11211 -c 1024 -P /etc/memcached/memcached.pid 
    

      

    查看memcached是否启动:

    # ps -ef | grep memcached

    memcached命令参数解释

    参数 参数解释及说明
    -p <num> 监听的端口
    -l <ip_addr> 连接的IP地址,,默认是本机。-l选项可以不使用,此时表示在所有网络接口地址上监听。建议是-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 显示帮助

  • 相关阅读:
    2:编写虚幻引擎中的UC和C++代码
    1:编写虚幻引擎中的UC和C++代码
    0:编写虚幻引擎中的UC和C++代码
    4:虚幻引擎网络架构:技术要点总结篇
    3:虚幻引擎网络架构:GameInfo,PlayerMove
    2:虚幻引擎网络架构:Replication
    1:虚幻引擎网络架构:Actors
    R12-表详解-总帐
    clob 类型
    成本更新和算法
  • 原文地址:https://www.cnblogs.com/a757956132/p/4566257.html
Copyright © 2011-2022 走看看