`
kayo
  • 浏览: 557880 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

Memcached Cache应该是分布式的Cache

阅读更多

昨天贴了这个帖子以后,有同学说我是不是写错了,Memcached Cache应该是分布式的Cache,怎么变成集中式了。

    这里把我另外一部分的内容贴出来。

    Memcached是一种集中式Cache,支持分布式横向扩展。这里需要有点说明,很多开发者觉得Memcached是一种分布式Cache,但是其实 Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键作分区存储,而这个区就是Memcached服务端的一个或者多个实 例,如果将客户端也囊括到Memcached中,那么可以部分概念上说是集中式的。其实回顾一下集中式的构架,无非两种情况:1.节点均衡的网状 (JBoss Tree Cache),利用JGroup的多播通信机制来同步数据。2.Master-Slaves模式(分布式文件系统),由Master来管理Slave,如 何选择Slave,如何迁移数据,都是由Master来完成,但是Master本身也存在单点问题。

总结几个它的特点来理解一下它的优点和限制。

         Memory:内存存储,不言而喻,速度快,对于内存的要求高,不指出的话所缓存的内容非持久化。对于CPU要求很低,所以常常采用将Memcached 服务端和一些CPU高消耗Memory低消耗应用部属在一起。(作为我们AEP正好有这样的环境,我们的接口服务器有多台,接口服务器对于CPU要求很高 (由于WS-Security),但是对于Memory要求很低,因此可以用作Memcached的服务端部属机器)

         集中式Cache:避开了分布式Cache的传播问题,但是需要非单点保证其可靠性,这个就是后面集成中所作的cluster的工作,可以将多个 Memcached作为一个虚拟的cluster,同时对于cluster的读写和普通的memcached的读写性能没有差别。

         分布式扩展:Memcached的很突出一个优点,就是采用了可分布式扩展的模式。可以将部属在一台机器上的多个Memcached服务端或者部署在多个 机器上的Memcached服务端组成一个虚拟的服务端,对于调用者来说完全屏蔽和透明。提高的单机器的内存利用率,也提供了scale out的方式。

         Socket通信:传输内容的大小以及序列化的问题需要注意,虽然Memcached通常会被放置到内网作为Cache,Socket传输速率应该比较高 (当前支持Tcp和udp两种模式,同时根据客户端的不同可以选择使用nio的同步或者异步调用方式),但是序列化成本和带宽成本还是需要注意。这里也提 一下序列化,对于对象序列化的性能往往让大家头痛,但是如果对于同一类的Class对象序列化传输,第一次序列化时间比较长,后续就会优化,其实也就是说 序列化最大的消耗不是对象序列化,而是类的序列化。如果穿过去的只是字符串,那么是最好的,省去了序列化的操作,因此在Memcached中保存的往往是 较小的内容。

         特殊的内存分配机制:首先要说明的是Memcached支持最大的存储对象为1M。它的内存分配比较特殊,但是这样的分配方式其实也是对于性能考虑的,简 单的分配机制可以更容易回收再分配,节省对于CPU的使用。这里用一个酒窖比喻来说明这种内存分配机制,首先在Memcached起来的时候可以通过参数 设置使用的总共的Memory,这个就是建造一个酒窖,然后在有酒进入的时候,首先申请(通常是1M)的空间,用来建酒架,酒架根据这个酒瓶的大小分割酒 架为多个小格子安放酒瓶,将同样大小范围内的酒瓶都放置在一类酒架上面。例如20cm半径的酒瓶放置在可以容纳20-25cm的酒架A上,30cm半径的 酒瓶就放置在容纳25-30cm的酒架B上。回收机制也很简单,首先新酒入库,看看酒架是否有可以回收的地方,如果有直接使用,如果没有申请新的地方,如 果申请不到,采用配置的过期策略。这个特点来看,如果要放的内容大小十分离散,同时大小比例相差梯度很明显,那么可能对于使用空间来说不好,可能在酒架A 上就放了一瓶酒,但占用掉了一个酒架的位置。

         Cache机制简单:有时候很多开源的项目做的面面俱到,但是最后也就是因为过于注重一些非必要性的功能而拖累了性能,这里要提到的就是 Memcached的简单性。首先它没有什么同步,消息分发,两阶段提交等等,它就是一个很简单的Cache,把东西放进去,然后可以取出来,如果发现所 提供的Key没有命中,那么就很直白的告诉你,你这个key没有任何对应的东西在缓存里,去数据库或者其他地方取,当你在外部数据源取到的时候,可以直接 将内容置入到Cache中,这样下次就可以命中了。这里会提到怎么去同步这些数据,两种方式,一种就是在你修改了以后立刻更新Cache内容,这样就会即 时生效。另一种是说容许有失效时间,到了失效时间,自然就会将内容删除,此时再去去的时候就会命中不了,然后再次将内容置入Cache,用来更新内容。后 者用在一些时时性要求不高,写入不频繁的情况。

         客户端的重要性:Memcached是用C写的一个服务端,客户端没有规定,反正是Socket传输,只要语言支持Socket通信,通过Command 的简单协议就可以通信,但是客户端设计的合理十分重要,同时也给使用者提供了很大的空间去扩展和设计客户端来满足各种场景的需要,包括容错,权重,效率, 特殊的功能性需求,嵌入框架等等。

         几个应用点:小对象的缓存(用户的token,权限信息,资源信息)。小的静态资源缓存。Sql结果的缓存(这部分用的好,性能提高相当大,同时由于 Memcached自身提供scale out,那么对于db scale out的老大难问题无疑是一剂好药)。ESB消息缓存。

分享到:
评论

相关推荐

    分布式缓存系统Memcached

    基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库,分布式计算等领域。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。  2.Memcached工作机制 ...

    Memcached分布式缓存

    - **Cache::Memcached的分布式方法**:通常通过哈希算法(如一致性哈希)来确定键值对应该存储在哪台服务器上。 **4.2 Cache::Memcached的分布式方法** - **根据余数计算分散**:将键值对哈希后取模得到余数,再...

    MemCached 缓存系统配置说明

    Memcached是一种集中式Cache,支持分布式横向扩展。这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键做分区...

    Memcached缓存机制 用好Cache,优化应用

    Memcached是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于缓解数据库的负载,提高数据访问速度。它通过将数据存储在内存中,使得数据访问几乎达到内存的速度,从而极大地提升了应用的响应性能。 ...

    MemCached Cache Java Client封装优化历程

    3. **集中式Cache**:简化了分布式Cache的复杂性,但需要解决非单点故障问题,可通过集群实现高可用。 4. **分布式扩展**:Memcached支持横向扩展,多个实例组成虚拟服务端,对调用者透明。 5. **Socket通信**:基于...

    MemCached Cache Java Client封装优化历程.docx

    Memcached 是一个高性能、分布式的内存对象缓存系统,主要用于减少数据库的负载,提高应用程序的性能。它通过在内存中存储数据来提供快速访问,而不是每次请求时都去查询数据库。Memcached 的设计目标是简洁、高效,...

    (SSM框架)memcached整合Spring基于Cache注解.

    在SSM框架中引入Memcached并基于Spring的Cache注解进行整合,可以实现高效、分布式的数据缓存,提升系统性能。下面将详细阐述这一过程中的关键知识点。 1. **Memcached介绍**: Memcached是一款高性能、分布式的...

    SSM与memcached整合项目Spring Cache

    memcached是一款高性能的分布式内存对象缓存系统,广泛用于减轻数据库负载,提高网站响应速度。它通过键值对存储数据,简单且高效。在Java应用中,通常使用spymemcached或xmemcached库来与memcached服务器通信。 ...

    MemcachedDemo----分布式缓存系统C#应用实例

    本实例主要介绍如何使用C#语言集成和应用Memcached作为分布式缓存解决方案,以实现网站负载量的提升。 Memcached是一款开源、高性能、分布式的内存对象缓存系统,它设计的目标是简化数据存储和检索过程,通过将数据...

    第11章 分布式Cache

    常见的分布式Cache系统包括Redis、Memcached、Hadoop HDFS、Tachyon等。其中,Redis以其丰富的数据结构支持和高性能而受到广泛青睐,而Memcached则以其简单的设计和高效的缓存能力被大量采用。Hadoop HDFS和Tachyon...

    ZendFramework 1 cache for Redis,Memcached

    2. **Memcached**: Memcached 是一个分布式内存对象缓存系统,用于加速动态Web应用程序。它通过在内存中存储数据来减少数据库访问,从而提高性能。Memcached 支持简单的键值对存储,主要适用于存储小块数据(如字符...

    第八章 企业项目开发--分布式缓存memcached1

    项目组织结构方面,创建了一个名为`ssmm0-cache`的模块,专门用于存放分布式缓存相关的代码,例如Memcached、Redis以及Spring Cache等。项目使用Maven进行构建管理,通过`ssmm0pom.xml`定义了父模块,包含用户管理、...

    用Memcached 实现简单Session Cache Server

    Memcached是一款轻量级、高性能的分布式内存对象缓存系统,常用于减轻数据库的负载。它通过在内存中存储数据,提供快速的键值存储服务。在实现Session Cache Server时,我们将Memcached作为存储Session的地方,当...

    详解一种用django_cache实现分布式锁的方式

    在本文中,我们将探讨如何利用`django_cache`实现分布式锁。 **Django Cache 系统** Django 的缓存系统提供了多种缓存后端,包括 Memcached、Redis 以及使用数据库存储的缓存。`django_cache` 是 Django 中用于...

    memcached的细节文档

    - **Cache::Memcached分布式方法**:通常基于哈希来决定数据存储到哪个服务器。 - **ConsistentHashing**:一致性哈希算法,即使缓存服务器数量发生变化,也只影响一小部分数据的存储位置,减少了数据重新分配的影响...

    memcached全面剖析.pdf

    memcached 是一款高性能的分布式内存对象缓存系统,能够将数据存储在内存中,以提高动态 Web 应用程序的速度和效率。下面是 memcached 的相关知识点: 什么是 memcached? memcached 是一个基于内存的缓存系统,...

    Memcached、Redis、MySQL存储层面试问题

    可以通过使用Memcached客户端来实现分布式集群,客户端可以自动发现和连接到Memcached服务器,从而实现分布式缓存。 3. Memcached服务特点及工作原理是什么? Memcached服务器可以在内存中存储数据,从而提高访问...

Global site tag (gtag.js) - Google Analytics