目录
12、如何将 memcached 中 item 批量导入导出?
13、如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?
16、memcached 能接受的 key 的最大长度是多少?
20、memcached 的内存分配器是如何工作的?为什么不适用malloc/free!?为何要使用 slabs?
10、memcached 如何实现冗余机制?
不实现!我们对这个问题感到很惊讶。
Memcached
应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个 memcached
节点失去了所有数据,您应该可以从数据源(比如数据库)再次获取到数据。您应该特别注意,您的应用应该可以容忍节点的失效。不要写一些糟糕的查询代码,寄希望于 memcached来保证一切!如果您担心节点失效会大大加重数据库的负担,那么您可以采取一些办法。比如您可以增加更多的节点(来减少丢失一个节点的影响),热备节点(在其他节点 down
了的时候接管
IP
),等等。
11、memcached 如何处理容错的?
不处理! 在
memcached
节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:
忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。
把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分 key
会因为哈希值的改变而被映射到(与原来)不同的节点上。
启动热备节点,接管失效节点所占用的
IP
。这样可以防止哈希紊乱(hashing chaos
)。
如果希望添加和移除节点,而不影响原先的哈希结果,可以使用一致性哈希算法(consistent hashing
)。您可以百度一下一致性哈希算法。支持一致性哈希的客户端已经很成熟,而且被广泛使用。去尝试一下吧!
两次哈希(
reshing
)。当客户端存取数据时,如果发现一个节点
down了,就再做一次哈希(哈希算法与前一次不同),重新选择另一个节点(需要注意的时,客户端并没有把 down
的节点从节点列表中移除,下次还是有可能先哈希到它)。如果某个节点时好时坏,两次哈希的方法就有风险了,好的节点和坏的节点上都可能存在脏数据(stale data
)。
12、如何将 memcached 中 item 批量导入导出?
您不应该这样做!
Memcached
是一个非阻塞的服务器。任何可能导致memcached 暂停或瞬时拒绝服务的操作都应该值得深思熟虑。向
memcached中批量导入数据往往不是您真正想要的!想象看,如果缓存数据在导出导入之间发生了变化,您就需要处理脏数据了;
13、如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?
因此,批量导出导入数据并不像您想象中的那么有用。不过在一个场景倒是很有用。如果您有大量的从不变化的数据,并且希望缓存很快热(warm
)起来,批量导入缓存数据是很有帮助的。虽然这个场景并不典型,但却经常发生,因此我们会考虑在将来实现批量导出导入的功能。
如果一个
memcached
节点
down
了让您很痛苦,那么您还会陷入其他很多麻烦。您的系统太脆弱了。您需要做一些优化工作。比如处理”
惊群
”
问题(比如memcached 节点都失效了,反复的查询让您的数据库不堪重负
…
这个问题在
FAQ的其他提到过),或者优化不好的查询。记住,Memcached
并不是您逃避优化查询的借口。
14、memcached 是如何做身份验证的?
没有身份认证机制!
memcached
是运行在应用下层的软件(身份验证应该是应用上层 的职 责)。memcached
的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,memcached
可以很快地创建新连接,服务器端也无需任何配置。如果您希望限制访问,您可以使用防火墙,或者让 memcached
监听
unix domain socket。
15、memcached 的多线程是什么?如何使用它们?
线程就是定律(
threads rule
)!在
Steven Grimm
和
Facebook
的努力下,memcached 1.2 及更高版本拥有了多线程模式。多线程模式允许
memcached
能够充分利用多个 CPU
,