zoukankan      html  css  js  c++  java
  • 理论加实践,谈谈我对memcached的学习感悟!

    近几天,浏览了大量的memcached相关文章,又自己动手实践了一番
    至此,对memcached有了更加深入的了解
    在继续编写memcached操作类(基于java_memcached-release)的同时
    留下一些自认为比较重要的知识,算是总结一下吧
    如果其中有理解不当的,请高手给予指点,万分感谢!
    也欢迎正在或即将使用memcached的朋友一起分享学习心得,有意者请email:inetwild@gmail.com

    一、常用命令

    1. 将memcached.exe安装为Windows服务:memcached.exe -d install
    2. 启动memcached服务:memcached.exe -d start
    3. 启动memcached服务(windows命令):net start "memcached Server"
    4. 停止memcached服务(windows命令):net stop "memcached Server"
    5. 连接到memcached控制台:telnet ServerIP 11211
    6. 打印当前memcached服务器状态:stats
    7. 打印当前memcached服务器Items(记录)的统计信息:stats items
    8. 打印当前memcached服务器Slab(分区)及Chunk(块)的统计信息:stats slabs
    9. 打印指定Slab中的KEY列表(可用于遍历items,但效率较低,慎用!):stats cachedump SlabId Limit_num。显示结果:ITEM KeyName [ValueByteLength b; LastAccessTime s]。值得注意的是,经过测试确认:那个LastAccessTime并不是记录到期时间,而是最后一次的get时间,并且get之后,也不会自动延长expiry到期时间)。
    10. 添加新记录:add KeyName 0 0 ValueByteLength [回车] ValueContent
    11. 删除记录 : delete KeyName
    12. 添加或更新记录 : set KeyName 0 0 ValueByteLength [回车] ValueContent
    13. 更新记录 : replace KeyName 0 0 ValueByteLength [回车] ValueContent

    二、Think in memcached

    1. memcached预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk),但同一个分区里:块的长度(bytes)是固定的
    2. 可以将memcached的这种内存管理方式理解为Table,分区(Slab)就是列(Col),而块(Chunk)就是这列下面相同宽度的单元格(Td
    3. 虽然各个Slab的长度不同,但容量却是相同的。例如:Slab Class1的Chunk长度:128,个数:8192,Slab Class1的内存容量:128 * 8192 = 1M;Slab Class2的Chunk长度:256,个数:4096,Slab Class2的内存容量:256 * 4096 = 1M。
    4. 有新的记录要存入memcached时,首先根据记录的长度查找刚好能够容纳下它的Slab,再找到这个分区里闲置的Chunk,存入即可。
    5. 内存浪费的一个小场景:要存入一个100bytes的记录,但最合适的Slab却是128bytes,那么每存入一个这样的记录,就会产生28bytes的闲置内存
    6. 将记录从memcached删除后,已经分配的内存(即Chunk),也不会被释放,而是会重复利用,这样就彻底解决了内存碎片的问题
    7. memcached采用“惰性”方式来应对记录的超期问题,就是它不会主动去监视记录是否超期,而是在每次get时查看记录的时间戳,如果已超期就会扔掉。这样的好处就是不会占用宝贵的CPU资源。比如,在使用flushAll命令清除全部items后,使用stats命令查看items统计数是不变的,除非get一个不存在的记录之后,stats的统计结果才会减少1个,不过使用delete命令删除记录,stats的统计结果却会马上表现出来
    8. 有新记录入住时,memcached为它推荐房间(Slab)的优先级是:闲置的 > 该退房的超期的) > 已有人却很少过来住的get命中数最少的)。这种方式简称:LRU
    9. memcached最大的特点就是“分布式”,可以为一个应用部署多个memcached服务器,根据其负载权重(weight),自动进行简单而又有效的任务均衡。
    10. 当memcached向多个Server保存一条记录时,会根据特定算法生成一个“”,这个“键”决定了这条记录会被打发到哪台服务器;同样,当提取这条记录时,也会根据同样的算法得到这个“”,那么也会清楚当初是哪台服务器接收的这条记录,返回就没问题了。
    11. 在将memcached用于生产环境时,最好根据存储记录的平均长度对memcached的Slab分区规则进行设置,来尽量减少内存浪费及最大化利用好内存资源。(具体方式不详)
    12. 更多待补充

    三、在Java项目中使用memcached

    1. 面向Javamemcached客户端,目前为止我知道的有两种:
      1. 阿里软件:memcache-client-forjava
      2. gwhalin: Memcached-Java-Client
    2. 阿里的客户端用的人蛮多的,据说效率也很不错,以后有时间会好好学习一下,但我现在主要使用的还是第二种:java_memcached-release
    3. 刚开始使用的是java_memcached-release_1.6,算是比较老的版本了,提供的API较少,仅包含最常用的几个命令。优点是支持压缩功能,在addset时,如果value大于指定bytes,会自动对其进行压缩,个人觉得这个功能还是很实用的。
    4. 后来尝试performance分支下的java_memcached-release_2.6.6,二进制包下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads
    5. 该分支由Schooner中国团队开发完成,向你们致敬!
    6. 使用上与1.6的基本兼容,重载或新增了很多常用的函数,更方便了,主要是性能上有300%左右的提升,并且重新实现的连接池,修复了之前连接数太多所导致的OutOfMemory异常问题。但可惜的是,从2.6.1开始,不再支持压缩功能,据说这样可以减少CPU负担。所以,需要将以前用1.6写的JAVA初始化客户端部分关于压缩的两个参数注释掉:
      1. setCompressEnable
      2. setCompressThreshold

    过几天将发布本人基于java_memcached-release_2.6.6封装的memcached操作类,支持服务器配置文件,对于没有使用spring的项目还是很合适的。

    版权声明: 本文为博主 网无忌 原创文章,欢迎转载,但请务必标注原文链接。

    本文链接: https://www.cnblogs.com/netWild/archive/2013/05/10/memcachedNote.html

  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/netWild/p/memcachedNote.html
Copyright © 2011-2022 走看看