要Memcached仍是要Redis?在构建一款现代且由数据库驱动的Web应用程序并但愿使其拥有更为出色的性能表现时,这个问题总会时不时出现、并给每一位开发人员带来困扰。在考虑对应用程序的性能表现进行提高时,缓存机制每每是解决问题的重要起点,而Memcached与Redis则常常被做为初步方案来加以比较。html
这两套声名显赫的缓存引擎拥有着诸多类似之处,但它们一样也具有大量显著差别。做为两者当中更年轻也更加灵活的方案,Redis被大部分技术人员视为首选目标——但请别掉以轻心,不容忽视的重要例外状况也是客观存在的。算法
二者类似之处数据库
让咱们先从两者的类似之处谈起。Memcached与Redis都属于内存内、键值数据存储方案。它们都从属于数据管理解决方案中的NoSQL家族,并且都基于一样的键值数据模型。双方都选择将所有数据保存在内存当中,这天然也就让它们成为很是理想的缓冲层实现方案。从性能表现的角度来看,两类数据存储机制也具有诸多共通性,包括拥有几乎相同的特征(与指标)表现、并且高度关注工做负载的数据吞吐量与延迟情况。编程
除了同为内存内键值数据存储方案,Memcached与Redis还都是至关成熟并且极具人气的开源项目。Memcached最初是由Brad Fitzpatrick于2003年开发而成,当时其直接服务对象为LiveJournal交友网站。在此以后,Memcached被从新用C语言进行了编写(其最初实现方式为Perl语言)且投身于公共领域,并在这里逐步发展为现代Web应用程序的构建基石。Memcached项目的当前开发工做主要关注其运行稳定性及优化效果方面,而再也不积极为其打造更多新型功能。缓存
Redis则由Salvatore Sanfilippo于2009年建立,并且时至今日Sanfilippo仍然担任着该项目的首席开发者以及唯一维护者的角色。Redis有时候会被人们称为“强化版的Memcached”。考虑到从Memcached身上吸收并借鉴到大量宝贵的经验教训,这样的评价其实并不使人意外。Redis在功能多样性方面要赛过Memcached,这虽然让者更为强大也更具灵活性、但其复杂程度也较后者为甚。服务器
做为两套被众多企业采纳并部署在无数关键性生产任务环境当中的解决方案,Memcached与Redis在任何一种可行性编程语言领域都拥有可以提供支持的客户端库,并且两者也被包含在开发人员们使用的多种库及软件包以内。事实上,如今咱们甚至已经很难找到一套不包含Memcached或者Redis内置支持机制的Web堆栈。网络
Memcached与Redis为何如此受人拥戴?除了两者卓越的实际效果以外,双方各自极为简便的上手难度也是又一大加分项。不管是Memcached仍是Redis,其使用便捷性在开发人员当中均可谓广为人知。只须要几分钟咱们就能完成安装工做,并让它们开始与应用程序顺畅协做。换句话来讲,只需投入一小部分时间与精力,你们就能得到立竿见影且效果极佳的性能表现提高——具体而言,性能将直接步入新的量级。面对如此简单而又可以带来巨大收益的解决方案,又有谁能抗拒得了它们的诱惑呢?编程语言
什么时候应该使用Memcached性能
相对Memcached而言,Redis的面世时间更晚且具有更多功能,所以开发人员一般将其视为默认性首选方案。不过有两类特殊场景仍然是Memcached的一家天下。首先就是对小型静态数据进行缓存处理,最具表明性的例子就是HTML代码片断。Memcached的内部内存管理机制虽然不像Redis的那样复杂,但却更具实际效率——这是由于Memcached在处理元数据时所消耗的内存资源相对更少。做为Memcached所支持的唯一一种数据类型,字符串很是适合用于保存那些只须要进行读取操做的数据,由于字符串自己无需进行进一步处理。测试
除此以外,Memcached在横向扩展方面也比Redis更具优点。因为其在设计上的思路倾向以及相对更为简单的功能设置,Memcached在实现扩展时的难度比Redis低得多。不过根据咱们了解到的状况,目前已经有多种通过测试且切实有效的方案可以将Redis扩展至多台服务器之上,而其即将发布的3.0版本(感兴趣的朋友能够点击此处查看其候选版本说明)将包含专门针对横向扩展场景的内置集群化机制。
什么时候应该使用Redis
除非你们须要考虑某种限定性条件(例如处理传统应用程序)对于Memcached的特殊依赖性,或者本身的实际用例属于前面提到的两类场景中的一种,不然请直接选择Redis并加以运用。凭借着Redis所带来的卓越缓存方案,咱们将拥有强大的处理能力——例如对缓存内容及持久性进行细节调整的能力——以及出色的总体执行效率。
Redis几乎在缓存管理工做中的每个侧面都表现出显而易见的优越性。这套缓存方案采用所谓数据回收机制,可以将陈旧数据从内存中删除以提供新数据所必需的缓存空间。Memcached的数据回收机制使用的是LRU(即最低近期使用量)算法,并且每每会比较武断地直接删除掉与新数据体系相近的原有内容。相比之下,Redis容许用户更为精准地进行细化控制,利用六种不一样回收策略确切提升缓存资源的实际利用率。Redis还采用更为复杂的内存管理与回收对象备选方案。
Redis还能为咱们带来最大程度的灵活性空间,从而保证管理员在打理缓存对象时拥有充裕的施展平台。在这方面,Memcached将键名限制在250字节,值也被限制在不超过1MB,且只适用于普通字符串。相比之下,Redis则将键名与值的最大上限各自设定为512MB,且支持二进制格式。Redis支持六种数据类型,所以可以更加智能地对数据进行缓存处理及操做,这至关于为应用程序开发人员敞开了一道通往无尽量性的大门。
相对于将对象保存为序列化字符串,Redis容许开发人员以散列方式将对象域及值加以保存,并利用单一键对其进行管理。Redis散列机制的存在保证开发人员无需经历获取完整字符串、反序列化、更新值、对象从新序列化并在每次值更新后利用其替代缓存内完整字符串这一系列复杂的流程——这也意味着资源消耗量得以下降、性能表现迎来显著提高。Redis所支持的其它数据类型,例如Lists以及Sets——也可被用于实现更加复杂的缓存管理模式。
Redis的另外一大重要优点在于,它所保存的数据具有透明化特性,也就是说服务器可以直接对这些数据进行操做。Redis当中提供160多种可用命令,其中大部分用于实现数据处理操做并经过服务器端脚本将逻辑嵌入至数据存储体系当中。这些内置命令及用户脚本带来了极大的灵活性优点,足以帮助你们直接在Redis内部完成数据处理任务——而没必要将数据在网络中的其它专门处理系统之间来回移动。
Redis还提供可选并且可以具体调整的数据持久性方案,其设计目的在于在发生规划内停机或者计划外故障以后对缓存内容进行从新引导。虽然咱们更倾向于强调缓存内数据的易失性与暂时性,但将数据在磁盘中加以持久保存在某些缓存场景当中仍然极具现实意义。这种机制可以在设备重启以后快速将保存在磁盘上的数据从新载入至缓存当中,从而大大缩短缓存预热周期并根据主数据存储内容对当前缓存内容进行从新评估。
最后但也一样重要的一点是,Redis可以提供复制功能。复制功能旨在帮助缓存体系实现高可用性配置方案,从而在遭遇故障的状况下继续为应用程序提供不间断的缓存服务。很明显,一套成熟的缓存方案应该可以在应用程序发生故障时略微甚至彻底不给用户体验或者应用程序性能表现带来任何影响,而这种对缓存内容及服务可用性的有力保障在大多数状况下也成为缓存解决方案的一大主要优点。
开源软件业界一直在不断努力,为咱们带来当下技术领域中最为出色的各种解决方案。而在谈到利用缓存机制对应用程序性能表现加以提高这一话题时,Redis与Memcached做为两款广受赞誉并且久经考验的解决方案、也天然而然地成为完成这项任务的两大首选技术成果。不过从功能多样性以及设计先进性的角度出发,Redis显然更适合被你们做为通用性的首选方案——除了少部分特殊场景以外。