1、Memcached是怎么工作的?
??Memcached像一个巨大的、存储了很多<key,value>对的哈希表。通过key,可以存储或查询任意的数据。 ??客户端可以把数据存储在多台Memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后Memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。 ??举个列子,假设有3个客户端 1、2、3,3台Memcached A、B、C:Client1 想把数据”barbaz”以key“foo”存储。Client1首先参考节点列表(A,B,C),计算key“foo”的哈希值,假设 Memcached B被选中。接着,Client1直接连接到Memcached B,通过 key “foo”把数据”barbaz”存储进去。Client2使用与Client1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的Memcached列表(A, B, C)。于是,经过相同的哈希计算(阶段一),Client 2 计算出 key “foo”在Memcached B 上,然后它直接请求 Memcached B,得到数据”barbaz”。 ??各种客户端在Memcached中数据的存储形式是不同的(Java Hibernate、JSON 等)。一些客户端实现的哈希算法也不一样。但是,Memcached服务器端的行为总是一致的。 ??最后,从实现的角度看,Memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决 C10K问题,并具有极佳的可扩展性。
2、Memcached最大的优势是什么?
??Memcached 最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量Memcached到集群中。Memcached 之间没有相互通信,因此不会增加Memcached的负载;没有多播协议,不会网络通信量爆炸。Memcached的集群很好用。内存不够/CPU 不够用了时,增加几台Memcached服务器即可。
3、Memcached和MySQL的查询缓存相比,有什么优缺点?
??把Memcached引入应用中,还是需要不少工作量的。MySQL 有个使用方便的查询缓存,可以自动地缓存 SQL 查询的结果,被缓存的 SQL 查询可以被反复地快速执行。Memcached 与之相比,怎么样呢?MySQL的查询缓存是集中式的,连接到该查询缓存的MySQL服务器都会受益。 ??当修改表时,MySQL的查询缓存会立刻被刷新。存储一个 memcached item只需要很少的时间,但是当写操作很频繁时,MySQL 的查询缓存会经常让所有缓存数据都失效。 ??在多核 CPU 上,MySQL的查询缓存会遇到扩展问题。在多核 CPU上,查询缓存会增加一个全局锁,由于需要刷新更多的缓存数据,速度会变得更慢。 ??在MySQL的查询缓存中,是不能存储任意的数据的(只能是 SQL 查询结果)。而利用Memcached,可以搭建出各种高效的缓存。比如,可以执行多个独立的查询,构建出一个用户对象,然后将用户对象缓存到Memcached中。而查询缓存是 SQL 语句级别的,不可能做到这一点。在小的网站中,查询缓存会有所帮助,但随着网站规模的增加,查询缓存的弊将大于利。 ??查询缓存能够利用的内存容量受到 MySQL 服务器空闲内存空间的限制。给数据库服务器增加更多的内存来缓存数据,固然是很好的。但是,有了Memcached,只要有空闲的内存,都可以用来增加 Memcached集群的规模,然后就可以缓存更多的数据。
4、Memcached的缓存机制是怎样的?
??主要的缓存机制是LRU算法+超时失效。当您存数据到Memcached中,可以指定该数据在缓存中可以呆多久。如果Memcached的内存不够用了,过期的数据会优先被替换,接着就轮到最老的未被使用的数据。
5、Memcached如何实现冗余机制?
??不实现。Memcached应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个Memcached节点失去了所有数据,开发者应该可以从数据源(比如数据库)再次获取到数据。
6、Memcached如何处理容错的?
??不处理。在Memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,有几种方案供选择:
- 忽略它。 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。
- 把失效的节点从节点列表中移除。在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分 key 会因为哈希值的改变而被映射到(与原来)不同的节点上。
- 启动热备节点,接管失效节点所占用的 IP。这样可以防止哈希紊乱。
- 如果希望添加和移除节点,而不影响原先的哈希结果,可以使用一致性哈希算法。
- 两次哈希。当客户端存取数据时,如果发现一个节点失效了,就再做一次哈希(哈希算法与前一次不同),重新选择另一个节点(需要注意的时,客户端并没有把失效的节点从节点列表中移除,下次还是有可能先哈希到它)。如果某个节点时好时坏,两次哈希的方法就有风险了,好的节点和坏的节点上都可能存在脏数据。
7、Memcached是如何做身份验证的?
??没有身份认证机制。Memcached是运行在应用下层的软件(身份验证应该是应用上层的职责)。Memcached的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,Memcached可以很快地创建新连接,服务器端也无需任何配置。
8、Memcached的多线程是什么?如何使用它们?
??Memcached1.2 及更高版本拥有了多线程模式。多线程模式允许 Memcached能够充分利用多个 CPU,并在CPU 之间共享所有的缓存数据。Memcached使用一种简单的锁机制来保证数据更新操作的,因此上面的方法可以全面提高性能。 ??如果系统负载并不重,也许不需要启用多线程工作模式。如果在运行一个拥有大规模硬件的、庞大的网站,将会看到多线程的好处。 ??简单地总结一下:命令解析(Memcached在这里花了大部分时间)可以运行在多线程模式下。Memcached内部对数据的操作是基于很多全局锁的(因此这部分工作不是多线程的)。
9、Memcached能接受的key的最大长度是多少?
??key的最大长度是250个字符。需要注意的是,250 是Memcached服务器端内部的限制。推荐使用使用较短的 key,可以节省内存和带宽。
10、Memcached对item的过期时间有什么限制?
??过期时间最大可以达到30天。Memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,Memcached就把item置为失效状态。
11、Memcached最大能存储多大的单个item?
??1MB。如果数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。
12、Redis和Memcached的区别
- 数据支持的类型
??Redis不仅仅支持简单的k/v类型的数据,同时还支持list、set、zset、hash 等数据结构的存储;Memcached只支持简单的k/v类型的数据,key和value都是string类型。 - 可靠性
??Memcached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的;Redis支持数据持久化和数据恢复,允许单点故障。 - 性能
??对于存储大数据,Memcached的性能要高于Redis。 - 应用场景
??Memcache:适合多读少写,大数据量的情况(一些官网的文章信息等)。 ??Redis:适用于对读写效率要求高、数据处理业务复杂、安全性要求较高的系统。 ??案例:分布式系统,存在Session之间的共享问题,因此在做单点登录的时候,我们利用Redis来模拟了Session的共享,来存储用户的信息,实现不同系统的Session共享。
|