最新消息:网站迁移至香港,数据恢复中。

Memcache专题四、高级设置和新特性

Linux ipcpu 813浏览

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命令,它们可以解决上面的问题。

样例如下:

  1. #@获取ipcpu当前值和id
  2. [root@s03.ipcpu.com memcached]#echo -e "gets ipcpu\r" | nc localhost 11211
  3. VALUE ipcpu 0 3 17379233
  4. ghi
  5. END
  6. #@根据id,写入新的值
  7. [root@s03.ipcpu.com memcached]#echo -e "cas ipcpu 0 0 3 17379233\r\n123\r" | nc localhost 11211
  8. STORED
  9. #@获取ipcpu当前值和id
  10. [root@s03.ipcpu.com memcached]#echo -e "gets ipcpu\r" | nc localhost 11211
  11. VALUE ipcpu 0 3 17379234
  12. 123
  13. END
  14. #@假如中间有人修改次item
  15. [root@s03.ipcpu.com memcached]#echo -e "set ipcpu 0 0 3\r\nghi\r" | nc localhost 11211
  16. STORED
  17. #@根据id,写入新的值会失败
  18. [root@s03.ipcpu.com memcached]#echo -e "cas ipcpu 0 0 3 17379234\r\n123\r" | nc localhost 11211
  19. EXISTS
  20. [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

这个功能是一个手动操作的触发的,命令如下:

  1. #@This will allocate 1 page from slab 3 to slab 5.
  2. 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专题四、高级设置和新特性