Memcached

一、memcached能接受的key的最大长度是多少? (250字符)
key的最大长度是250个字符。须要注意的是,250是memcached服务器端内部的限制,若是您使用的客户端支持"key的前缀"或相似特性,那么key(前缀+原始key)的最大长度是能够超过250个字符的。咱们推荐使用使用较短的key,由于能够节省内存和带宽。 (咱们对key+value的总长度控制在64kb,没有对key单独作限制)
 
二、memcached对item的过时时间有什么限制? (最大过时时间30天)
过时时间最大能够达到30天。memcached把传入的过时时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。(咱们不限制,到2038年)
 
三、memcached最大能存储多大的单个item?  (1MB)
1MB。若是你的数据大于1MB,能够考虑在客户端压缩或拆分到多个key中。
      (咱们对key+value的总长度控制在64kb,没有对key单独作限制)
        
四、为何单个item的大小被限制在1M byte以内?
  简单的缘由:由于内存分配器的算法就是这样的。
      详细的缘由:Memcached的内存存储引擎(引擎未来可插拔...),使用slabs来管理内存。内存被分红大小不等的slabs chunks(先分红大小相等的slabs,而后每一个slab被分红大小相等chunks,不一样slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增加,直到达到最大的可能值。
       若是最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B ...
        slab中chunk越大,它和前面的slab之间的间隙就越大。所以,最大值越大,内存利用率越低。Memcached必须为每一个slab预先分配内存,所以若是设置了较小的因子和较大的最大值,会须要更多的内存。
        还有其余缘由使得您不要这样向memcached中存取很大的数据...不要尝试把巨大的网页放到mencached中。把这样大的数据结构load和unpack到内存中须要花费很长的时间,从而致使您的网站性能反而很差。
         若是您确实须要存储大于1MB的数据,你能够修改slabs.c:POWER_BLOCK的值,而后从新编译memcached;或者使用低效的malloc/free。其余的建议包括数据库、MogileFS等。
 
五、我能够在不一样的memcached节点上使用大小不等的缓存空间吗?这么作以后,memcached可以更有效地使用内存吗?
Memcache客户端仅根据哈希算法来决定将某个key存储在哪一个节点上,而不考虑节点的内存大小。所以,您能够在不一样的节点上使用大小不等的缓存。可是通常都是这样作的:拥有较多内存的节点上能够运行多个memcached实例,每一个实例使用的内存跟其余节点上的实例相同。
 
六、memcached的内存分配器是如何工做的?为何不适用malloc/free!?为什么要使用slabs?
实际上,这是一个编译时选项。默认会使用内部的slab分配器。您确实确实应该使用内建的slab分配器。最先的时候,memcached只使用malloc/free来管理内存。然而,这种方式不能与OS的内存管理之前很好地工做。反复地malloc/free形成了内存碎片,OS最终花费大量的时间去查找连续的内存块来知足malloc的请求,而不是运行memcached进程。若是您不一样意,固然可使用malloc!只是不要在邮件列表中抱怨啊:)
       slab分配器就是为了解决这个问题而生的。内存被分配并划分红chunks,一直被重复使用。由于内存被划分红大小不等的slabs,若是item的大小与被选择存放它的slab不是很合适的话,就会浪费一些内存。Steven Grimm正在这方面已经作出了有效的改进。算法

七、一致性Hash算法的目的有两点:一是节点变更后其余节点受影响尽量小;二是节点变更后数据从新分配尽量均衡 。数据库

八、为何要运行 memcached ?
若是网站的高流量很大而且大多数的访问会形成数据库高负荷的情况下,使用 memcached 可以减轻数据库的压力。缓存


九、适用memcached的业务场景?
1)若是网站包含了访问量很大的动态网页,于是数据库的负载将会很高。因为大部分数据库请求都是读操做,那么memcached能够显著地减少数据库负载。
2)若是数据库服务器的负载比较低但CPU使用率很高,这时能够缓存计算好的结果( computed objects )和渲染后的网页模板(enderred templates)。
3)利用memcached能够缓存session数据、临时数据以减小对他们的数据库写操做。
4)缓存一些很小可是被频繁访问的文件。
5)缓存Web 'services'(非IBM宣扬的Web Services,译者注)或RSS feeds的结果.。安全


十、不适用memcached的业务场景?
1)缓存对象的大小大于1MB
Memcached自己就不是为了处理庞大的多媒体(large media)和巨大的二进制块(streaming huge blobs)而设计的。
2)key的长度大于250字符
3)虚拟主机不让运行memcached服务
若是应用自己托管在低端的虚拟私有服务器上,像vmware, xen这类虚拟化技术并不适合运行memcached。Memcached须要接管和控制大块的内存,若是memcached管理的内存
被OS或 hypervisor交换出去,memcached的性能将大打折扣。
4)应用运行在不安全的环境中
Memcached为提供任何安全策略,仅仅经过telnet就能够访问到memcached。若是应用运行在共享的系统上,须要着重考虑安全问题。
5)业务自己须要的是持久化数据或者说须要的应该是database服务器


十一、可以遍历memcached中全部的item吗?
不能,这个操做的速度相对缓慢且阻塞其余的操做(这里的缓慢时相比memcached其余的命令)。memcached全部非调试(non-debug)命令,例如add, set, get, fulsh等不管
memcached中存储了多少数据,它们的执行都只消耗常量时间。任何遍历全部item的命令执行所消耗的时间,将随着memcached中数据量的增长而增长。当其余命令由于等待(遍历所
有item的命令执行完毕)而不能获得执行,于是阻塞将发生。session


十二、memcached的cache机制是怎样的?
Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。当您存数据到memcached中,能够指定该数据在缓存中能够呆多久Which is forever, or some time in the
future。若是memcached的内存不够用了,过时的slabs会优先被替换,接着就轮到最老的未被使用的slabs。数据结构


1三、memcached如何实现冗余机制?
不实现!Memcached应该是应用的缓存层,从设计自己来京就不带有任何冗余机制。若是一个memcached节点失去了全部数据,应该能够从数据源(好比数据库)再次获取到数据。应
用系统应该能够容忍节点的失效。若是担忧节点失效会大大加剧数据库的负担,那么能够采起一些办法。好比您能够增长更多的节点(来减小丢失一个节点的影响),热备节点(在其余节
点down了的时候接管IP)等等。多线程


1四、memcached如何处理容错的?
在节点失效的状况下,集群没有必要作任何容错处理。若是发生了节点失效,应对的措施彻底取决于用户。
节点失效时,下面列出几种方案供您选择:
1)忽略它! 在失效节点被恢复或替换以前,还有不少其余节点能够应对节点失效带来的影响。
2)把失效的节点从节点列表中移除。作这个操做千万要当心!在默认状况下(余数式哈希算法),客户端添加或移除节点,会致使全部的缓存数据不可用!由于哈希参照的节点列表变化
了,大部分key会由于哈希值的改变而被映射到(与原来)不一样的节点上。
3)启动热备节点,接管失效节点所占用的IP。这样能够防止哈希紊乱(hashing chaos)。
4)若是但愿添加和移除节点,而不影响原先的哈希结果,可使用一致性哈希算法(consistent hashing)。
5)两次哈希(reshing)。当客户端存取数据时,若是发现一个节点down了,就再作一次哈希(哈希算法与前一次不一样),从新选择另外一个节点(须要注意的时,客户端并无把down
的节点从节点列表中移除,下次仍是有可能先哈希到它)。若是某个节点时好时坏,两次哈希的方法就有风险了,好的节点和坏的节点上均可能存在脏数据(stale data)。dom


1五、如何将memcached中item批量导入导出?
不该该这样作!Memcached是一个非阻塞的服务器。任何可能致使memcached暂停或瞬时拒绝服务的操做都应该值得深思熟虑。向memcached中批量导入数据每每不是您真正想要
的!想象看,若是缓存数据在导出导入之间发生了变化,您就须要处理脏数据了;若是缓存数据在导出导入之间过时了,您又怎么处理这些数据呢?
所以,批量导出导入数据并不像想象中的那么有用。不过在一个场景却是颇有用。若是您有大量的从不变化 的数据,而且但愿缓存很快热(warm)起来,批量导入缓存数据是颇有帮助
的。socket


1六、可是我确实须要把memcached中的item批量导出导入,怎么办??
若是须要批量导出和导入,最可能的缘由通常是从新生成缓存数据须要消耗很长的时间或者数据库坏了让您饱受痛苦。
若是一个memcached节点down了让您很痛苦,那么必须对数据库作一些优化工做。好比处理"惊群"问题( memcached节点都失效了,反复的查询让数据库不堪重负)或者存在优化不
好的查询等。Memcached 并非逃避优化查询的借口和方案。
这里给出一些提示:
使用MogileFS(或者CouchDB等相似的软件)在存储item,把item计算出来并dump到磁盘上。MogileFS能够很方便地覆写item,并提供快速地访问。甚至能够把MogileFS中的item
缓存在memcached中,这样能够加快读取速度。 MogileFS+Memcached的组合能够加快缓存不命中时的响应速度,提升网站的可用性。
从新使用MySQL。MySQL的 InnoDB主键查询速度很是快。若是大部分缓存数据均可以放到VARCHAR字段中,那么主键查询的性能将更好。从memcached中按key查询几乎等价于
MySQL的主键查询:将key 哈希到64-bit的整数,而后将数据存储到MySQL中。您能够把原始(不作哈希)的key存储都普通的字段中,而后创建二级索引来加快查询...key被动地失效,
批量删除失效的key,等等。


1七、memcached是如何作身份验证的?
没有身份认证机制!memcached是运行在应用下层的软件(身份验证应该是应用上层的职责)。memcached的客户端和服务器端之因此是轻量级的,部分缘由就是彻底没有实现身份验
证机制。这样,memcached能够很快地建立新链接,服务器端也无需任何配置。若是您但愿限制访问,您可使用防火墙,或者让memcached监听unix domain socket。


1八、memcached的多线程是什么?如何使用它们?线程就是定律(threads rule)!在Steven Grimm和Facebook的努力下,memcached 1.2及更高版本拥有了多线程模式。多线程模式容许memcached可以充分利用多个CPU,并在CPU之间共享全部的缓存数据。memcached使用一种简单的锁机制来保证数据更新操做的互斥。相比在同一个物理机器上运行多个memcached实例,这种方式可以更有效地处理multigets。若是系统的负载并不重,那么不须要启用多线程工做模式。

相关文章
相关标签/搜索