为什么Redis在缓存方面击败了Memcached

为什么Redis在缓存方面击败了Memcached

为什么Redis在缓存方面击败了Memcached

 
3 人赞同了该文章

前言:最近在程序员百态上写了一篇文章,赢得了一些小伙伴的认同,这让我更有动力来分享,说明的是,分享的文章基本上是英文的文章,我会翻译成中文,文章末尾注明来源链接,好了,现在开始吧!

Memcached有时效率更高,但是Redis几乎总是更好的选择

Memcached还是Redis?关于从数据库驱动的现代Web应用程序中获取更多性能的讨论中几乎总是会出现这个问题。当需要提高性能时,通常是第一步要使用缓存,而Memcached或Redis通常是最先使用的地方。

这些著名的缓存引擎具有许多相似之处,但也有重要区别。Redis是两者中较新的和功能更广泛的,几乎总是首选。

Redis与Memcached两个缓存工具的比较

让我们从相似之处开始。尽管Redis更准确地描述为数据结构存储,但Memcached和Redis均用作内存中的键值数据存储。Memcached和Redis都属于NoSQL数据管理解决方案系列,并且都基于键值数据模型。它们都将所有数据保留在RAM中,这当然使它们作为缓存层极其有用。在性能方面,两个数据存储也非常相似,在吞吐量和延迟方面表现出几乎相同的特征(和度量)。

Memcached和Redis都是成熟且广受欢迎的开源项目。Memcached最初由Brad Fitzpatrick于2003年为LiveJournal网站开发。从那时起,Memcached用C进行了重写(最初的实现是在Perl中进行的),并置于公共领域,它已成为现代Web应用程序的基石。Memcached的当前开发侧重于稳定性和优化,而不是添加新功能。

Redis是由Salvatore Sanfilippo于2009年创建的,而Sanfilippo仍是该项目的首席开发商。Redis有时被描述为“类固醇上的Memcached”,考虑到Redis的某些部分是根据从使用Memcached中学到的教训而构建的,这不足为奇。Redis比Memcached具有更多功能,因此功能更强大,更灵活。

客户端库以各种可能的编程语言为Memcached和Redis所使用,在许多公司中以及在无数​​关键任务的生产环境中都使用了Memcached和Redis,并且该库包含在面向开发人员的众多程序包中。实际上,这是一个罕见的Web堆栈,不包含对Memcached或Redis的内置支持。

为什么Memcached和Redis如此受欢迎?它们不仅非常有效,而且也相对简单。对于开发人员来说,使用Memcached或Redis入门很容易。只需几分钟即可进行设置,并使它们与应用程序一起使用。因此,少量的时间和精力投入会对性能产生直接而显着的影响-通常数量级。具有巨大利益的简单解决方案;你会得到你想到的神奇与惊讶。

何时使用Memcached

当缓存相对较小的静态数据(例如HTML代码片段)时,最好使用Memcached。Memcached的内部内存管理虽然不如Redis复杂,但在最简单的用例中效率更高,因为它消耗的元数据存储资源相对较少。字符串(Memcached支持的唯一数据类型)非常适合存储只能读取的数据,因为字符串不需要进一步处理。

大型数据集通常涉及序列化数据,这总是需要更多空间来存储。尽管Memcached实际上仅限于以序列化形式存储数据,但是Redis中的数据结构可以本地存储数据的任何方面,从而减少了序列化开销。

Memcached优于Redis的第二种情况是扩展。由于Memcached是多线程的,因此您可以通过提供更多的计算资源来轻松地进行扩展,但是您将丢失部分或全部的缓存数据(取决于您是否使用一致的哈希)。Redis主要是单线程的,可以通过集群进行水平扩展而不会丢失数据。群集是一种有效的扩展解决方案,但设置和操作相对较复杂。

何时使用Redis

由于Redis的数据结构,几乎总是要使用它。将Redis用作缓存,您将获得很多功能(例如微调缓存内容和持久性的能力)并提高整体效率。一旦使用了数据结构,对于特定的应用场景,效率的提升将变得巨大。

Redis的优势在缓存管理的几乎每个方面都显而易见。高速缓存采用一种称为数据逐出的机制,通过从内存中删除旧数据为新数据腾出空间。Memcached的数据逐出机制采用了最近最少使用的算法,并在某种程度上任意驱逐了大小与新数据相似的数据。

相比之下,Redis允许对逐出进行细粒度控制,让您从六种不同的逐出策略中进行选择。Redis还采用了更复杂的方法来进行内存管理和逐出候选者。Redis支持惰性驱逐和主动驱逐,只有在需要或主动占用更多空间时才驱逐数据。

Redis为您可以缓存的对象提供了更大的灵活性。尽管Memcached将键名限制为250个字节,并且只能与纯字符串一起使用,但是Redis允许键名和值每个最大为512MB,并且它们是二进制安全的。此外,Redis具有五种主要数据结构可供选择,通过智能缓存和缓存数据的操作为应用程序开发人员开辟了无限的可能性。

Redis的数据持久性

使用Redis数据结构可以简化和优化多个任务-不仅在缓存时,甚至在您希望数据持久且始终可用时。例如,开发人员可以使用Redis Hash来存储对象的字段和值,并使用单个键来管理它们,而不是将对象存储为序列化的字符串。Redis Hash为开发人员节省了获取整个字符串,反序列化,更新值,重新序列化对象以及将缓存中的整个字符串替换为新的每次更新所需的新值的需求,这意味着更低的资源消耗和更高的性能。

Redis提供的其他数据结构(例如lists, sets, sorted sets, hyperloglogs, bitmaps, 和geospatial indexes)可用于实现更复杂的场景。用于时序数据摄取和分析的排序集是Redis数据结构的另一个示例,该结构极大地降低了复杂性并降低了带宽消耗。

Redis的另一个重要优点是它存储的数据不是透明的,因此服务器可以直接对其进行操作。Redis提供的180多个命令中有相当大的一部分专门用于数据处理操作,并通过服务器端Lua脚本将逻辑嵌入数据存储本身。这些内置命令和用户脚本使您可以灵活地直接在Redis中处理数据处理任务,而不必通过网络将数据传送到另一个系统进行处理。

Redis提供了可选的可调数据持久性,旨在在计划关闭或计划外失败后引导缓存。尽管我们倾向于将缓存中的数据视为易失性和瞬态数据,但将数据持久保存到磁盘在缓存场景中可能非常有价值。重新启动后立即使高速缓存的数据可用于加载,可以大大缩短高速缓存的预热时间,并从主数据存储中删除重新填充和重新计算高速缓存内容所涉及的负载。

Redis内存中数据复制

Redis还可以复制其管理的数据。复制可用于实现高可用性的缓存设置,该设置可以承受故障并为应用程序提供不间断的服务。就对用户体验和应用程序性能的影响而言,缓存故障仅比应用程序故障稍差一点,因此在大多数情况下,拥有一种行之有效的解决方案来保证缓存的内容和服务可用性是一个主要优势。

最后但并非最不重要的一点是,在操作可见性方面,Redis提供了一系列指标和大量自省命令,可用于监视和跟踪使用情况以及异常行为。有关数据库各个方面的实时统计信息,正在执行的所有命令的显示,客户端连接的列表和管理-Redis拥有所有这些以及更多。

当开发人员意识到Redis的持久性和内存中复制功能的有效性时,他们经常将其用作第一响应数据库,通常用于分析和处理高速数据并向用户提供响应,而第二(通常是较慢)数据库仍在维护发生的事情的历史记录。当以这种方式使用时,Redis也是分析用例的理想选择。

Redis用于数据分析

立即想到三种分析方案。在第一种情况下,当使用Apache Spark之类的方法迭代处理大型数据集时,可以将Redis用作Spark先前计算的数据的服务层。在第二种情况下,将Redis用作共享的内存中分布式数据存储可以使Spark处理速度提高45到100倍。最后,一种非常普遍的情况是用户需要自定义报告和分析,但是从固有的批处理数据存储(如Hadoop或RDBMS)中检索数据会花费太长时间。在这种情况下,内存数据结构存储(例如Redis)是获得亚毫秒分页和响应时间的唯一实用方法。

当使用庞大的运营数据集或分析工作负载时,在内存中运行所有内容可能并不划算。为了以较低的成本实现亚毫秒级的性能,Redis Labs创建了一个Redis版本,版本在RAM和闪存的组合上运行,并且可以配置RAM与闪存的比率。尽管这为加速工作负载处理开辟了几种新途径,但它也为开发人员提供了仅运行其“闪存缓存”的选项。

开源软件继续提供当今可用的一些最佳技术。在通过缓存提高应用程序性能时,Redis和Memcached是最成熟且经过生产验证的候选人。但是,鉴于Redis的功能更丰富,设计更先进,潜在用途更多以及在规模上具有更高的成本效率,Redis几乎在每种情况下都应该是您的首选。

文章出处:

 

 

 

发布于 2020-02-13 15:19

posted on   漫思  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2022-02-21 Ant Design Mobile 5.0 来了
2022-02-21 2021年值得推荐的3个React动画库及思考
2022-02-21 15个有用的React动画库,马上让你的项目变得高大上
2022-02-21 ES6rest运算符
2020-02-21 vscode 方法代码块的注释生成方法
2020-02-21 VSCode打开webpack项目,无法对@指向的文件使用“转到定义”,怎么办?
2020-02-21 ES6 @与..

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示