很早以前就听说memcache了,以前也是用memcache,可是却没有对里面的原理有深入一点的研究。
其实网上有一篇很好的文章,是一个哥们翻译过来一篇日本人对memcache原理的介绍,这篇文章实在写的
很好,图文并茂,所以实在没有必要我来这里班门弄斧了,只是在后头补充一些我的想法而已。
先上地址: http://tech.idv2.com/2008/08/17/memcached-pdf/
补充一些,首先,有个很好用的图形工具可以帮助我们监控和分析memcache,以前我的文章中提到过:
我认为对memcache进行Flush操作后,会让所有的数据过期,除标志为过期外,但是key依然存在,这个用上面的图形工具查看slab和item就能看到,对于过期的数据,memcache
并不会去理会,也会保存value所在,只有当get来触发的时候,会delete这个对应的key.
这里在说一些内存分配的东西,这些其实才是重点:
memcached在启动的时候可以用-f 指定chunk的增量倍数,我们这里叫他因子吧,默认的是1.25,
你会发现启动memcache会分配40个slab class,这个并不是固定的,而是因为chunk × 个数 就要超过
1M了,memcached对一个slab固定为1M,所以里面的元素chunk自然也是小于1M的,同样,超过1M的数据是无法
保存到memcache里面的(使用压缩参数除外),当slab里面的空闲chunk用完了,memcached会有两种方式来处理新来的item,这个取决于是否已经到了memcached的limit memory了,如果还有空闲的内存,会分配新的slab,再被成chunk,
如果已经满了,则会对相同size的数据优先进行LRU(针对slab class)。
所以如果一开始服务器都保存小的数据,会把空余的内存先分配掉了,到后来留给大的文件就更少,当然大的文件进行的LRU就更多了。
还有很多同学可能喜欢用memcache来做统计,注意不要类似的代码:
$count = $memcache->get(key); $count++; $memcache->set(key);
这样会因为并非的问题而造成统计的不准确,可以使用memcache->increment,
到达数量后保存到数据库,代码略了。
如果有什么错误请email我。
admin 2009-10-13 6:38 pm 说:
有个朋友email我,大概的情况是:"配置格式 -f 1.1 -m 1024
memcached启动后,在任务管理器中分配了97M的内存,数据在GET 、 SET 会出现丢失了,我通过记录日志发出丢失永远都是这个KEY的值,而在获取失败后我将数据加入缓存中是成功的,估计在下一个请求中将原来的数据踢掉了,造成这几个key一直在争资源。
事实上程序的内存并不满,而任务管理器中mem这个进程的内存不增加了。 我写一测试程序连续写入10000个50KB的不同的数据,内存明显在增加了,而且我也可以读取到,但我项目中这个一直无法出现丢失。".
这个问题可能是我在文章中描述的不够清楚吧,我再解释一下,其实这位朋友之所以会出现这种情况,是因为在之前的“连续写入10000个50KB”,可以试一下,先不要这个操作,我相信会看到不一样的结果了。原理是因为“当slab里面的空闲chunk用完了,memcached会有两种方式来处理新来的item,这个取决于是否已经到了memcached的limit memory了”,在任务管理器中看到的内存并不是真的memcached使用的内存,memcached是在一开始根据“-f 1.1 -m 1024”来分配,一开始分配直到slab中chunk为1M了,这里面的内存是分配了,但是没有使用上,如果这里面的slab不够用了,会从剩下的内存中在分配slab,但是原来部分的内存如果没有放数据在任务管理器中是看不出来的,建议使用memcache.php这个脚本来分析会更明白一些。
[回复]
zhangzf 2010-01-13 5:12 pm 说:
当我把一个大于5M的数据压缩以后放入memcached中就会set失败。该怎么解决呀?我用的是windows。
[回复]
Codytan 2010-01-13 7:19 pm 回复:
memcached并不是用来做分布式文件存储的,只适合用来存储小的数据量,如cache,memcached超过1M的数据是无法存储进去的.
[回复]
zhangzf 2010-01-14 10:09 am 说:
那么对于1G左右的数据,我不想放在数据库中,该怎么处理呀?
[回复]
Codytan 2010-01-14 11:44 am 回复:
只是1G数据估计也不是想做分布式文件存储,你的数据如果不想丢请不要单纯的放到内存中,
可以考虑持久化话key-value存储,可以查看我关于tokyo cabinet tyrant 的几篇文章.
[回复]
言情小说 2010-05-06 6:58 pm 说:
有时候找点信息也真不容易,在这里找到了,谢谢。
[回复]