zoukankan      html  css  js  c++  java
  • memcache学习资料

    memcached
    是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。官方站点 http://memcached.org/
    memcached运行流程图

    memcached特点
    •基于C/S架构,协议简单
    •基于libevent 的事件处理
    •自主内存存储处理
    存储方式为slab allocation  
    Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
    Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。
    Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。其结构图如下:

    Growth Factor
    memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制slab之间的差异,chunk大小的差异。默认值为1.25。
    通过memcached-tool查看指定memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25

    Slab Allocation的缺点
    Slab Allocation可以有效的解决内存碎片问题,但是在如下情况下,会导致内存的浪费:
    每个slab的chunk大小是固定的,当item的占用空间实际小于chunk大小时,会出现内存浪费
    每个slab的大小是固定的(因为page是固定的),当slab不能被他所拥有的chunk整除时,会出现内存浪费
    按照Growth Factor因子生成指定大小的slab,而某slab id根本未被使用时,会出现内存浪费
    通过memcache添加tem的时候
    1.Memcache计算item的大小(key+value+flags),选取合适的slab(刚好能放下该item的slab)
    2.如果这个item对应的slab未出现过,则申请1个page(注意,这1M空间不论是否达到memcached使用内存都可以申请成功)并加该item存入slab中的chunk
    3.如果item对应的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2中delete的chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。</p>
    4.如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page,这个page被分为对应大小的chunk,继续存储。
    5. 如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)此时会有eviction++
    数据过期方式
    • Lazy Expiration
    memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。
    • LRU
    memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
    memcached安装和使用
    yum install -y libevent  memcached  libmemcached
    启动命令:
    /etc/init.d/memcached start
    查看进程
    ps aux |grep memcached
    默认监听127.0.0.1:11211,默认使用内存64M,这个数值可以调节
    vim /etc/sysconfig/memcached
    调整CACHESIZE
    -d选项是启动一个守护进程
    -m是分配给Memcache使用的内存数量,单位是MB,这里是200MB
    -u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。
    -l是监听的服务器IP地址
    -p是设置Memcache监听的端口,默认是11211
    -c选项是最大运行的并发连接数,默认是1024
    -P是设置保存Memcache的pid文件
    查看memcached运行状态
    memcached-tool 127.0.0.1:11211  stats
    或者echo stats |nc 127.0.0.1 11211  需要安装nc工具  yum install -y nc
    若安装libmemcached后,可以使用命令
    memstat --servers=127.0.0.1:11211 查看memcached服务状态
    命令行用法:
    telnet  127.0.0.1 11211
    set key2 0 60 3
    abc
    STORED
    get key2
    VALUE key2 0 3
    abc
    END
    语法规则 
    <command name> <key> <flags> <exptime> <bytes> <data block>
    注: 在windows下是Enter键
    a) <command name> 可以是”set”, “add”, “replace”。
    “set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
    “add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
    “replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
    有时“add”,“replace”也会存储不上。
    b) <key> 客户端需要保存数据的key。
    c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。
    该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
    客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
    d) <exptime> 过期的时间。
    若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
    如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
    e) <bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
    f) <data block>需要存储的内容,输入完成后,最后客户端需要加上” ”(windows直接点击Enter)作为”命令头”的结束标志。
    set key3 1 100 4
    abcd
    STORED
    get key3
    VALUE key3 1 4
    abcd
    END
    replace key3 1 200 5
    abcdx
    STORED
    get key3
    VALUE key3 1 5
    abcdx
    END
    delete key3
    DELETED
    get key3
    END
    参考资料
    memcached常用命令   http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html
    php连接使用memcached
    首先需要安装php的memcache扩展
    可以使用php自带的pecl安装程序
    # /usr/local/php/bin/pecl install memcache
    也可以从源码安装
    # wget  http://www.lishiming.net/data/attachment/forum/memcache-2.2.3.tgz
    # tar zxf memcache-2.2.3.tgz
    # cd memcache-2.2.3
    # /usr/local/php/bin/phpize
    # ../configure --with-php-config=/usr/local/php/bin/php-config
    # make && make install
    安装完后会有类似这样的提示:
    Installing shared extensions: /usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/
    把这个记住,然后修改php.ini,把
    extension_dir = "./"
    修改为
    extension_dir = "/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20060922/"
    并添加一行
    extension="memcache.so"
    检验
    # /usr/local/php/bin/php -m
    测试php脚本
    wget www.apelearn.com/study_v2/.memcache.txt
    mv .memcache.txt   test.php
    /usr/local/php/bin/php test.php
    附件:http://www.apelearn.com/bbs/thread-8660-1-1.html
    扩展学习
    maget搭建memcached集群  http://blog.snsgou.com/post-800.html
    memcached get all keys方法  http://www.aikaiyuan.com/6433.html

  • 相关阅读:
    Educational Codeforces Round 33 (Rated for Div. 2) B. Beautiful Divisors【进制思维/打表】
    Educational Codeforces Round 33 (Rated for Div. 2) A. Chess For Three【模拟/逻辑推理】
    java中的BigInteger
    动态规划-最长上升子序列(LIS模板)多解+变形
    Rain on your Parade---hdu2389(HK求最大匹配)
    Air Raid---hdu1151(最小路径覆盖)
    Swap---hdu2819(最大匹配)
    棋盘游戏---hdu1281(最大匹配)
    The Accomodation of Students---hdu2444(二分图,最大匹配)
    COURSES---poj1469 hdu1083(最大匹配)
  • 原文地址:https://www.cnblogs.com/the-study-of-linux/p/5233330.html
Copyright © 2011-2022 走看看