关于memcache那些事

memcached.高性能,高并发的分布式内存对象缓存系统,纯内存的缓存系统,效率极高,memcached主要目的,通过自身内存缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态web应用的速度,网站架构的并发能力和扩展性

memcached可缓存用户重复的请求的动态内容(如:文字。session等);数据调用,API调用或页面引用结果的直接数据,如字符串,对象等。http://www.memcached.org/

memcached.png1,通常在一个memcached场景中,对于不会经常变动的数据放在memcached中,“数据预热”!也可以做成分类数据静态化文件,并且可以通过web缓存或者CND加速2,热点数据缓存,对于一些更新频繁的数据也会(人为或者预热)写入到memcached

memcached特性:1,memcached通过telnet/nc等命令可直接操作memcached数据,并且memcached协议基于文本格式,和二进制格式2,支持epoll/kqueue异步io模型,使用libevent作为事件处理通知机制3,key/value键值数据类型4,全内存缓存,速度高,速率快,无持久化存储,当冲击则丢失,如果希望数据保留则可以使用redis,或者memecachedb

Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:

  • 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
  • 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
  • 各服务器间彼此无视:不在服务器间进行数据同步;
  • O(1)的执行效率
  • 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;key-value,键值缓存
  • 键值:查找标准和对应值,键hash编码存放,和key的每一个字段的key做比较,比较过程在不出现码冲突,键冲突的情况下,查找时间无论键的hash个数,只要没出现冲突,则时间一样。

    yum安装:yum install libevent libevent-devel nc telnet memcached -y

    [root@NFS-WEB2 ~]# which memcached
    /usr/bin/memcached
    [root@NFS-WEB2 ~]# memcached -m 16m -p 11211 -d -uroot -c 8192
    [root@NFS-WEB2 ~]# lsof -i :11211
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    memcached 3159 root 26u IPv4 25986 0t0 TCP *:memcache (LISTEN)
    memcached 3159 root 27u IPv6 25987 0t0 TCP *:memcache (LISTEN)
    memcached 3159 root 28u IPv4 25990 0t0 UDP *:memcache
    memcached 3159 root 29u IPv6 25991 0t0 UDP *:memcache
    [root@NFS-WEB2 ~]#

    多实例启动

    [root@NFS-WEB2 ~]# memcached -m 16m -p 11212 -d -uroot -c 8192
    [root@NFS-WEB2 ~]# lsof -i :11212
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    memcached 3186 root 26u IPv4 27205 0t0 TCP *:11212 (LISTEN)
    memcached 3186 root 27u IPv6 27206 0t0 TCP *:11212 (LISTEN)
    memcached 3186 root 28u IPv4 27209 0t0 UDP *:11212
    memcached 3186 root 29u IPv6 27210 0t0 UDP *:11212
    [root@NFS-WEB2 ~]#

    memcached -h相关参数:存储类命令:set(设置缓存), add(新增), replace(替换), append(在一个缓存后附加新的内容), prepend(在缓存内容之前)获取数据类命令:get(查看), delete(删除), incr/decr统计类命令:stats, stats items, stats slabs, stats sizes清理命令: flush_all

    进程与连接的设置:-d: 守护进程方式允许-u: 指定用户-l: 指定进程监控服务器iP-p: 监控tcp端口号默认11211-P(大写):设置保存的pid文件内存相关:-m:指定memcached服务科缓存的最大内存,默认64M-M: memcached服务内存不够时禁用LRU,如果内存满了会报错-n:为key+value_flags分配的最小内存空间,默认48字节-f :设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;-L:启用打内存页,可以降低内存消耗, 改进性能并发连接:-c:最大并发连接,默认1024-t: 线程数,默认4,由于memcached采用NIO,线程太多用处不大-R:每个event最大请求数,默认20-C:禁用CAS,可以禁止版本计数,减少开销-S: 启用sasl进行用户认证;调试参数:-v: 打印较少的errors/warnings-vv: 打印非常多调试信息和错误输出到控制台,也打印客户端命令和响应-vvv: 打印极多的调试信息和错误输出,打印内部状态转变

    [root@NFS-WEB2 ~]# telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.

    插入

    set user01 0 0 7
    linuxea
    STORED

    查看

    get user01
    VALUE user01 0 7
    linuxea
    END

    删除

    delete user01
    DELETED
    get user01
    END

    当有多实例时在使用:

    memcached -m 16m -p 11211 -d -uroot -c 8192 -P /var/run/11211.pid
    

    kill cat /var/run/11211.pid 即可

    查看

    [root@NFS-WEB2 memcache-2.2.7]# memcached -u root -vv
    slab class 1: chunk size 96 perslab 10922
    slab class 2: chunk size 120 perslab 8738
    slab class 3: chunk size 152 perslab 6898
    slab class 4: chunk size 192 perslab 5461
    slab class 5: chunk size 240 perslab 4369
    slab class 6: chunk size 304 perslab 3449
    slab class 7: chunk size 384 perslab 2730
    slab class 8: chunk size 480 perslab 2184
    slab class 9: chunk size 600 perslab 1747
    slab class 10: chunk size 752 perslab 1394
    slab class 11: chunk size 944 perslab 1110
    slab class 12: chunk size 1184 perslab 885
    slab class 13: chunk size 1480 perslab 708
    slab class 14: chunk size 1856 perslab 564
    slab class 15: chunk size 2320 perslab 451
    slab class 16: chunk size 2904 perslab 361
    slab class 17: chunk size 3632 perslab 288
    slab class 18: chunk size 4544 perslab 230
    slab class 19: chunk size 5680 perslab 184
    slab class 20: chunk size 7104 perslab 147
    slab class 21: chunk size 8880 perslab 118
    slab class 22: chunk size 11104 perslab 94
    slab class 23: chunk size 13880 perslab 75
    slab class 24: chunk size 17352 perslab 60
    slab class 25: chunk size 21696 perslab 48
    slab class 26: chunk size 27120 perslab 38
    slab class 27: chunk size 33904 perslab 30
    slab class 28: chunk size 42384 perslab 24
    slab class 29: chunk size 52984 perslab 19
    slab class 30: chunk size 66232 perslab 15
    slab class 31: chunk size 82792 perslab 12
    slab class 32: chunk size 103496 perslab 10
    slab class 33: chunk size 129376 perslab 8
    slab class 34: chunk size 161720 perslab 6
    slab class 35: chunk size 202152 perslab 5
    slab class 36: chunk size 252696 perslab 4
    slab class 37: chunk size 315872 perslab 3
    slab class 38: chunk size 394840 perslab 2
    slab class 39: chunk size 493552 perslab 2
    slab class 40: chunk size 616944 perslab 1
    slab class 41: chunk size 771184 perslab 1
    slab class 42: chunk size 1048576 perslab 1
    <26 server listening (auto-negotiate)
    <27 server listening (auto-negotiate)
    <28 send buffer was 124928, now 268435456
    <29 send buffer was 124928, now 268435456
    <28 server listening (udp)
    <29 server listening (udp)
    <28 server listening (udp)
    <29 server listening (udp)
    <28 server listening (udp)
    <29 server listening (udp)
    <28 server listening (udp)
    <29 server listening (udp)

    指定1.1的增长因子

    [root@NFS-WEB2 memcache-2.2.7]# memcached -u root -f 1.1 -vv
    slab class 1: chunk size 96 perslab 10922
    slab class 2: chunk size 112 perslab 9362
    slab class 3: chunk size 128 perslab 8192
    slab class 4: chunk size 144 perslab 7281
    slab class 5: chunk size 160 perslab 6553
    slab class 6: chunk size 176 perslab 5957
    slab class 7: chunk size 200 perslab 5242
    slab class 8: chunk size 224 perslab 4681

    php插件

    http://pecl.php.net/package/memcache
    wget http://pecl.php.net/get/memcache-2.2.7.tgz
    tar xf memcache-2.2.7.tgz
    cd memcached-2.2.7
    [root@NFS-WEB2 memcache-2.2.7]# /usr/local/php5.3/bin/phpize
    Configuring for:
    PHP Api Version: 20090626
    Zend Module Api No: 20090626
    Zend Extension Api No: 220090626
    [root@NFS-WEB2 memcache-2.2.7]# . /configure --enable-memcache --with-php-config=/usr/local/php5.3/bin/php-config
    [root@NFS-WEB2 memcache-2.2.7]# make
    [root@NFS-WEB2 memcache-2.2.7]# make install
    Installing shared extensions: /usr/local/php5.3/lib/php/extensions/no-debug-non-zts-20090626/

    编辑/usr/local/php/lib/php.ini,在“动态模块”相关的位置添加如下一行来载入memcache扩展:

    [root@NFS-WEB2 memcache-2.2.7]# vim /etc/php.ini
    extension = /usr/local/php5.3/lib/php/extensions/no-debug-non-zts-20090626/memcache.so
    [root@NFS-WEB2 php5.3]# /usr/local/php5.3/sbin/php-fpm

    memcache-info.png而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容:<?php$mem = new Memcache;$mem->connect("127.0.0.1", 11211) or die("Could not connect");

    $version = $mem->getVersion();echo "Server's version: ".$version."<br/>n";

    $mem->set('hellokey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");echo "Store data in the cache (data will expire in 600 seconds)<br/>n";

    $get_result = $mem->get('hellokey');echo "$get_result is from memcached server."; ?>

    phpMemcachedAdmin

    [root@NFS-WEB2 share]# yum -y install phpMemcachedAdmin
    [root@NFS-WEB2 share]# cp -R phpMemcachedAdmin/ /www/www/pma

    phpmemcachedadmin.png状态参数:curr_items 当前缓存条个数total_items 总的缓存条目total_connections 总的连接数curr_connections 当前的连接数connection_struouures 总的连接个数cmd_get 总的get次数get_hits get命中次数get_misses get未命中次数incr_hits 自动加1命中次数incr_misses 自动加1未命中次数bytes_read 用户发来的字节数bytes_written 总发送客户端响应的字节数limit_maxbytes memcache内存的总的字节大小threads 线程数 evictions 未获取空闲内存删除的items数

    memcache-master[root@NFS-WEB2 www]# unzip memadmin-master.zip 请输入图片描述

    memcachephp请输入图片描述工具下载地址:点我下载