理论加实践,谈谈我对memcached的学习感悟!

简介: 近几天,浏览了大量的memcached相关文章,又自己动手实践了一番至此,对memcached有了更加深入的了解在继续编写memcached操作类(基于java_memcached-release)的同时留下一些自认为比较重要的知识,算是总结一下吧如果其中有理解不当的,请高手给予指点,万分感谢!也欢...

近几天,浏览了大量的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的项目还是很合适的。

 

 

 

 


宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒
目录
相关文章
|
缓存 数据库 Memcache
艾伟:分布式缓存系统Memcached简介与实践
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。
972 0
|
缓存 NoSQL Linux
轻量级 memcached缓存代理 twemproxy实践
本文内容脑图如下: 文章共 533字,阅读大约需要 2分钟 ! 概 述 twemproxy(nutcracker) 是 Twitter开源的轻量级 memcached / redis 代理服务器,本质就是一个集群管理工具,主要用来弥补 Redis和 Memcached对集群管理的不足,其完成的最大功劳就是通过在后端减少同缓存服务器的连接数从而增加吞吐量。
1776 0
|
Web App开发 算法 关系型数据库
memcached 缓存数据库应用实践
1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存       缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。 数据库: mysql(关系型数据库,能够保证数据一致性,保证数据不丢失,当因为功能太多,导致性能不高) ===数据参考...
1780 0
【实践】Memcached实例解析
如果您觉得文章对您有帮助,可以【打赏】博主或点击文章右下角【推荐】一下。您的鼓励是博主坚持原创和持续写作的最大动力!
546 0
|
缓存 数据库 Memcache
分布式缓存系统Memcached简介与实践(.NET memcached client library)
原文:分布式缓存系统Memcached简介与实践(.NET memcached client library) 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。
1068 0
|
缓存 Java 数据库
分布式缓存系统Memcached学习心得
分布式缓存系统Memcached学习心得Posted on 2009-01-14 11:34 linFen 阅读(3458) 评论(1) 编辑 收藏 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。
878 0
|
存储 算法 Linux
Memcached入门学习
主要是记录学习Memcached的过程,做个记录方便复习和查看。 Memcached的特点: 1、全内存运转 2、哈希方式存储 3、简单的文本协议进行数据通信 4、只操作字符型数据 5、其它类型数据由应用解释,序列化以及反序列化 6、集群也由应用进行控制,采用一致性散列(哈希)算法 安装memcached 使用的环境是CentOS 6.
602 0
|
存储 监控 算法
memcached原理和实践篇
1.memcached简介 memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。
1043 0
|
6月前
|
Linux Memcache
Linux - 安装memcached
Linux - 安装memcached
109 0
Linux - 安装memcached
下一篇
无影云桌面