这里须要说明,不少开发者以为 Memcached 是一种分布式 Cache ,但其实 Memcached 服务端自己是单实例的,只是在客户端实现过程当中能够根据存储的主键做分区存储,而这个区就是 Memcached 服务端的一个或者多个实例,若是将客户端也囊括到 Memcached 中,那么能够部分概念上说是集中式的。集中式的构架,无非两种状况: 1. 节点均衡的网状( JBoss Tree Cache ),利用 JGroup 的多播通讯机制来同步数据。 2.Master-Slaves 模式(分布式文件系统),由 Master 来管理 Slave ,如何选择 Slave ,如何迁移数据,都是由 Master 来完成,可是 Master 自己也存在单点问题。数据库
特性、优势和限制缓存
Memory :内存存储,速度快,对于内存的要求高,所缓存的内容非持久化。对于 CPU 要求很低,因此经常采用将 Memcached 服务端和一些 CPU 高消耗 Memory 低消耗应用部属在一块儿 。(不然会互相挤占资源)框架
集中式 Cache :避开了分布式 Cache 的传播问题,可是须要非单点保证其可靠性,这须要 cluster 的工做,能够将多个 Memcached 做为一个虚拟的 cluster ,同时对于 cluster 的读写和普通的 memcached 的读写性能没有差异。异步
分布式扩展: Memcached 很突出的一个优势,就是采用了可分布式扩展的模式。能够将部属在一台机器上的多个 Memcached 服务端或者部署在多个机器上的 Memcached 服务端组成一个虚拟的服务端,对于调用者来讲彻底屏蔽和透明。提升的单机器的内存利用率 。分布式
Socket 通讯:传输内容的大小以及序列化的问题须要注意,虽然 Memcached 一般会被放置到内网做为 Cache, Socket 传输速率应该比较高(当前支持 Tcp 和 udp 两种模式,同时根据客户端的不一样能够选择使用 nio 的同步或者异步调用方式),可是序列化成本和带宽成本仍是须要注意。这里也提一下序列化,对于对象序列化的性能每每让你们头痛,可是若是对于同一类的 Class 对象序列化传输,第一次序列化时间比较长,后续就会优化,其实也就是说序列化最大的消耗不是对象序列化,而是类的序列化。若是穿过去的只是字符串,那么是最好的,省去了序列化的操做,所以在 Memcached 中保存的每每是较小的内容 。memcached
特殊的内存分配机制:首先要说明的是 Memcached 支持最大的存储对象为 1M (page)。它的内存分配比较特殊,可是这样的分配方式其实也是对于性能考虑的,简单的分配机制能够更容易回收再分配,节省对于 CPU 的使用(前面的文章中有描述) 。性能
Cache 机制简单: 首先它没有什么同步,消息分发,两阶段提交等等,它就是一个很简单的 Cache ,把东西放进去,而后能够取出来,若是发现所提供的 Key 没有命中,那么就很直白的告诉你,你这个 key 没有任何对应的东西在缓存里,去数据库或者其余地方取,当你在外部数据源取到的时候,能够直接将内容置入到 Cache 中,这样下次就能够命中了 。这里会提到怎么去同步这些数据,两种方式,一种就是在你修改了之后马上更新 Cache内容,这样就会即时生效。另外一种是说允许有失效时间,到了失效时间,天然就会将内容删除,此时再去去的时候就会命中不了,而后再次将内容置入 Cache ,用来更新内容。后者用在一些时时性要求不高,写入不频繁的状况。优化
客户端的重要性: 客户端设计的合理十分重要,同时也给使用者提供了很大的空间去扩展和设计客户端来知足各类场景的须要,包括容错,权重,效率,特殊的功能性需求,嵌入框架等等。spa
几个应用点:小对象的缓存(用户的 token ,权限信息,资源信息)。小的静态资源缓存。 Sql 结果的缓存(这部分用的好,性能提升至关大。)设计