Memcache专题四、高级设置和特性.md
一、调整factor来节省内存
Memcached 的默认参数(-f)factor是1.25,曾经为2,选择使用合适的factor,可以减少内存浪费
值越小,slab中chunk size差距越小,内存浪费越小,1.25适合缓存几百字节的对象。
建议:计算一下数据的预期平均长度,调整factor,以获得较高的内存利用率。
二、并发问题和CAS
如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程或者客户端操作过。这就是著名的fetch-modify-set导致的并发问题。在并发的情况下,您也可能覆写了一个被其他进程set的item,但是这个覆写可能就产生了竞跑条件,就导致了过期的数据被更新了。
Memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。
样例如下:
#@获取ipcpu当前值和id
[root@s03.ipcpu.com memcached]#echo -e "gets ipcpu\r" | nc localhost 11211
VALUE ipcpu 0 3 17379233
ghi
END
#@根据id,写入新的值
[root@s03.ipcpu.com memcached]#echo -e "cas ipcpu 0 0 3 17379233\r\n123\r" | nc localhost 11211
STORED
#@获取ipcpu当前值和id
[root@s03.ipcpu.com memcached]#echo -e "gets ipcpu\r" | nc localhost 11211
VALUE ipcpu 0 3 17379234
123
END
#@假如中间有人修改次item
[root@s03.ipcpu.com memcached]#echo -e "set ipcpu 0 0 3\r\nghi\r" | nc localhost 11211
STORED
#@根据id,写入新的值会失败
[root@s03.ipcpu.com memcached]#echo -e "cas ipcpu 0 0 3 17379234\r\n123\r" | nc localhost 11211
EXISTS
[root@s03.ipcpu.com memcached]#
三、数据持久化
因为memcached数据全都是存在内存里,重启之后全部丢失,因此有一些开源软件对其进行了扩展。
新浪开源的memcachedb就是一款,使用了Berkeley DB作为持久化引擎,但这款软件已经很久没有更新了。
另外redis的持久化策略比较多,可以选择redis作为替代产品。
四、主从复制
Repcached 是一个用来实现 Memcached 复制功能的补丁。但是只找到了1.2系列memcached配合补丁,1.4的没找到。
五、超时时间idle_timeout
Memcached对于连接上来的客户端,都会尽量保持,不会主动断开,但有些程序员写的程序都会开启新的连接,却不会关闭老的连接。导致无用的空闲连接仍然占用资源。
因此,从1.4.27版本起Memcached新增了idle_timeout参数,可以设置idle时间,默认为0,不会主动断开。
六、slab_reassign和slab_automove
我们之前说过memcached已经申请过的内存不会释放,假如有下面一个场景:
你有一个64G的服务器,memcached的slab 1 & 2 占用了60G,还剩余4G空间,因为业务需要,key的值变长了,使用slab 3 & 4。
因为你现在只有4G内存,一旦达到4G限制,memcached就会在slab 3 & 4开启LRU,清理最老的数据,而不会碰触slab 1 & 2的数据。
这显然是不合理的,最好的方法是将slab 1 & 2的数据清理掉,空出一些内存来使用。
从1.4.11开始你可以开启slab_reassign,slab_automove来实现上面的功能。
这两个参数需要使用参数“-o modern” (1.4.26+)modern这个参数还启用了其他一些常用的功能。
slab_reassign
这个功能是一个手动操作的触发的,命令如下:
#@This will allocate 1 page from slab 3 to slab 5.
echo 'slabs reassign 3 5' | nc localhost 11211;
slab_automove
这个就是上面功能的自动版,默认开启,当内存不足时会自动移动page,平时不会移动。
因此需要经常关注下有没有Eviciton。
七、WEB管理工具
http://www.junopen.com/memadmin/
http://lzone.de/cheat-sheet/memcached
八、其他常见问题
8.1、memcached能接受的key的最大长度是多少?
memcached能接受的key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制。如果使用的Memcached客户端支持”key的前缀”或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。推荐使用较短的key,这样可以节省内存和带宽。
8.2、memcached对item的过期时间有什么限制?
item对象的过期时间最长可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态,这是一个简单但obscure的机制。
参考资料
http://paweljaniak.co.za/2013/04/16/some-memcached-tips/
http://balodeamit.blogspot.jp/2014/02/slab-reallocation-in-memcache.html
https://github.com/memcached/memcached/wiki
转载请注明:IPCPU-网络之路 » Memcache专题四、高级设置和新特性