以下全文来自谷歌翻译。
英文原文链接:https://stackoverflow.com/questions/10558465/memcached-vs-redis
原作者:Carl Zulauf。
Redis比memcached更强大,更受欢迎,支持得更好。 Memcached只能完成Redis能做的一小部分事情。 Redis甚至在功能重叠的地方也更好。
对于任何新事物,请使用Redis。
Memcached vs Redis:直接比较
这两种工具都是功能强大的快速内存数据存储,可用作缓存。 两者都可以通过缓存数据库结果,HTML片段或其他任何可能成本高昂的代码来帮助加快应用程序的速度。
要考虑的事项
当用于相同的事情,这里是他们如何比较使用原来的问题的“考虑点”:
- 读/写速度 :两者都非常快。 基准因工作负载,版本和许多其他因素而异,但一般显示redis与memcached一样快或几乎一样快。 我建议redis,但不是因为memcached速度慢。 不是。
- 内存使用情况 :Redis更好。
- memcached:你可以指定缓存大小,当你插入物品的时候守护进程会快速增长到比这个大小更多一点。 从来没有真正的方法来回收任何空间,重启memcached。 所有的密钥都可能过期,你可以刷新数据库,它仍然会使用你配置的全部RAM。
- redis:设置最大尺寸取决于您。 Redis将永远不会使用超过它的内存,并会给你回忆它不再使用的内存。
- 我把100,000〜2KB的字符串(〜200MB)的随机句存入两者。 Memcached内存使用增长到〜225MB。 Redis的内存使用量增长到了228MB。 冲洗之后,redis下降到29MB,memcached停留在〜225MB。 它们在存储数据的方式上也是同样高效的,但只有一个能够回收。
- 磁盘I / O转储 :Redis明确的胜利,因为默认情况下,它具有非常可配置的持久性。 Memcached没有第三方工具转储磁盘的机制。
- 扩展 :在你需要多于一个实例作为缓存之前,两者都会给你提供很大的空间。 Redis包含的工具可以帮助您超越memcached而不是memcached。
memcached的
Memcached是一个简单的易失性缓存服务器。 它允许您存储键/值对,其中值被限制为最大1MB的字符串。
这很好,但是就是这样。 您可以通过密钥以极高的速度访问这些值,经常使可用网络甚至内存带宽饱和。
当你重新启动memcached你的数据不见了。 这对缓存很好。 你不应该存储那里重要的东西。
如果您需要高性能或高可用性,则可以使用第三方工具,产品和服务。
Redis的
Redis可以和memcached做同样的工作,并且可以做得更好。
Redis也可以充当缓存 。 它也可以存储键/值对。 在redis中,它们甚至可以达到512MB。
你可以关闭持久性,它也会很高兴地在重新启动时丢失你的数据。 如果你想让你的缓存重新启动,它可以让你做到这一点。 事实上,这是默认的。
它也是超快的,往往受网络或内存带宽的限制。
如果redis / memcached的一个实例对于您的工作负载来说性能不足,那么redis是明确的选择。 Redis包含集群支持,并在“框中”右侧附带高可用性工具( redis-sentinel )。 在过去的几年里,Redis也成为第三方工具领域的领导者。 像Redis实验室,亚马逊等公司提供了许多有用的Redis工具和服务。 redis周围的生态系统要大得多。 大规模部署的数量现在可能大于memcached。
Redis Superset
Redis不仅仅是一个缓存。 这是一个内存数据结构服务器。 下面你会发现Redis可以做的事情,不仅仅是像memcached这样简单的键/值缓存。 redis的大部分功能都是memcached无法做到的。
文档
Redis比memcached有更好的文档记录。 虽然这可能是主观的,但似乎一直是越来越真实。
redis.io是一个非常容易导航的资源。 它允许您在浏览器中尝试使用redis,甚至可以在文档中为每个命令提供实时交互式示例。
现在redis的memcached的stackoverflow结果是2x的两倍。 两倍的谷歌结果。 更多的语言更易于访问的例子。 更积极的发展。 更积极的客户端开发。 这些测量可能没有多少意义,但是结合起来就可以清楚地看出,对于redis的支持和文档是更新且更新的。
坚持
默认情况下,redis使用称为快照的机制将数据保存到磁盘。 如果有足够的内存,就可以将所有数据写入磁盘,而性能几乎没有下降。 这几乎是免费的!
在快照模式下,突然崩溃可能会导致少量数据丢失。 如果你绝对需要确保没有数据丢失,不要担心,redis也有你的背部AOF(追加文件)模式。 在这种持久性模式下,数据可以在写入时同步到磁盘。 这可以减少最大的写入吞吐量,但是速度却可以让磁盘写得更快,但是速度应该还是相当快的。
如果需要,有许多配置选项可以微调持久性,但默认值是非常明智的。 这些选项使安装redis成为一个安全,冗余的地方来存储数据变得非常容易。 这是一个真正的数据库。
许多数据类型
Memcached仅限于字符串,但是Redis是一个数据结构服务器,可以提供许多不同的数据类型。 它还提供了您充分利用这些数据类型所需的命令。
字符串( 命令 )
简单的文本或二进制值,最大可达512MB。 这是redis和memcached共享的唯一数据类型,尽管memcached字符串被限制为1MB。
Redis通过提供按位操作,位级操作,浮点数递增/递减支持,范围查询和多键操作的命令,为您提供更多利用此数据类型的工具。 Memcached不支持任何。
字符串对于各种用例都是有用的,这就是为什么memcached对于这种数据类型非常有用的原因。
哈希( 命令 )
散列有点像一个关键值存储中的关键值存储。 他们映射字符串字段和字符串值之间。 使用散列的字段 – >值映射比使用常规字符串的键 – >值映射稍微更节省空间。
哈希作为一个命名空间是有用的,或者当你想在逻辑上分组许多键。 使用散列,您可以高效地获取所有成员,将所有成员一起过期,一起删除所有成员等。非常适合需要分组的多个键/值对的任何用例。
散列的一个示例用于存储应用程序之间的用户配置文件。 以用户ID作为密钥存储的redis散列将允许您根据需要存储关于用户的尽可能多的数据位,同时将它们保存在单个密钥下。 使用散列而不是序列化配置文件到字符串的好处是,您可以让不同的应用程序在用户配置文件中读取/写入不同的字段,而不必担心一个应用程序会覆盖其他人所做的更改(如果您序列化过时数据)。
列表( 命令 )
Redis列表是字符串的有序集合。 它们针对列表的顶部或底部(又名:左侧或右侧)插入,读取或删除值进行了优化。
Redis提供了很多用于利用列表的命令,包括命令push / pop项,列表之间的push / pop,截断列表,执行范围查询等。
列表使得持久的,原子的,队列。 这些工作适用于作业队列,日志,缓冲区和其他许多用例。
设置( 命令 )
集合是唯一值的无序集合。 它们经过优化,可以让您快速检查值是否在集合中,快速添加/删除值,并测量与其他集合的重叠。
这些对于访问控制列表,独特的访问者跟踪器以及许多其他事物来说都是非常好的。 大多数编程语言都有类似的东西(通常称为Set)。 这就是这样,只分发。
Redis提供了几个命令来管理集合。 存在明显的增加,删除和检查集。 所以不太明显的命令就像弹出/读取一个随机项目和执行联合和与其他集合的交叉命令。
排序集( 命令 )
排序集合也是唯一值的集合。 顾名思义,这些是有序的。 他们按照分数排序,然后按字典顺序排列。
此数据类型已针对按分数进行快速查找进行了优化。 获取最高,最低或其中任何值的范围是非常快的。
如果您将用户添加到有序的集合中,并获得高分,则您拥有一个完美的排行榜。 随着新的高分进入,只需再次将他们添加到高分,并将重新排序您的排行榜。 对于记录上次访问的用户以及在您的应用程序中活跃的用户也非常有用。
用相同的分数存储数值使得它们按照字典顺序排列(按字母顺序排列)。 这可以用于诸如自动完成功能之类的功能。
许多有序的集合命令与集合命令类似,有时还有一个额外的得分参数。 还包括管理分数和按分数查询的命令。
地理
Redis有几个用于存储,检索和测量地理数据的命令。 这包括半径查询和测量点之间的距离。
技术上,redis中的地理数据存储在有序集合中,所以这不是一个真正独立的数据类型。 它更多的是在有序集合之上的扩展。
位图和HyperLogLog
像geo一样,这些并不是完全独立的数据类型。 这些命令允许您将字符串数据视为位图或超级日志。
位图是我在Strings
下引用的位级操作符。 这个数据类型是reddit最近的协作艺术项目的基本构建块: r / Place 。
HyperLogLog允许您使用恒定的极小的空间来以惊人的准确度计算几乎无限的唯一值。 只使用〜16KB,您可以高效地统计网站的唯一身份访问者数量,即使这个数字是百万。
交易和原子
redis中的命令是原子的,这意味着您可以确保只要向redis写入值,该值对连接到redis的所有客户端都可见。 没有等待这个价值传播。 技术上memcached也是原子的,但是redis在memcached之外增加了所有这些功能,值得注意的是,所有这些额外的数据类型和特性也是原子性的。
虽然与关系数据库中的事务不完全相同,但redis也具有使用“乐观锁定”( WATCH / MULTI / EXEC )的事务 。
流水线
Redis提供了一个称为“ 流水线 ”的功能。 如果你想要执行很多的redis命令,你可以使用流水线将它们一次发送到redis,而不是一次一个。
通常,当您执行redis或memcached命令时,每个命令都是一个单独的请求/响应循环。 借助流水线技术,redis可以缓存多个命令,并一次执行所有命令,并在一个响应中响应所有命令的所有响应。
这可以使您在批量导入或涉及大量命令的其他操作中实现更高的吞吐量。
发布/订阅
Redis的命令专用于pub / sub功能 ,允许redis充当高速消息广播器。 这允许单个客户端将消息发布到连接到频道的许多其他客户端。
Redis的pub / sub以及几乎所有的工具。 像RabbitMQ这样的专用消息代理可能在某些方面有优势,但是同一台服务器也可以为您提供持久的持久队列和其他数据结构,这是Redis通常会被证明是最好和最简单的工具为了工作。
Lua脚本
你可以考虑像redis自己的SQL或存储过程的lua脚本 。 这不仅仅是这个,而是比喻。
也许你想要redis执行复杂的计算。 也许你不能让你的交易回滚,需要保证一个复杂的过程的每一步都会自动发生。 这些问题和更多可以用lua脚本来解决。
整个脚本是以原子方式执行的,所以如果你可以把你的逻辑放到lua脚本中,你通常可以避免使用乐观锁定事务。
缩放
如上所述,redis包含内置的对集群的支持,并捆绑了自己的称为redis-sentinel
的高可用性工具。
结论
毫不犹豫,我会建议redis通过memcached任何新的项目,或现有的项目,还没有使用memcached。
以上可能听起来像我不喜欢memcached。 相反,它是一个强大的,简单的,稳定的,成熟的,强硬的工具。 甚至有一些使用情况比Redis快一点。 我喜欢memcached。 我不认为今后的发展很有意义。
Redis做memcached的一切,通常更好。 memcached的任何性能优势都是轻微的,并且是特定工作负载。 还有一些工作负载会使redis速度更快,redis可以执行的工作负载更多,哪些memcached根本无法工作。 面对巨大的功能差异,以及这两种工具如此之快而且高效的事实,这些微小的性能差异似乎微不足道,它们很可能是您的基础架构的最后一部分,您将不得不担心缩放。
memcached只有一种情况:memcached已经被用作缓存。 如果你已经缓存了memcached,那么继续使用它,如果它满足你的需求。 转移到redis可能是不值得的,如果你只是使用redis来缓存,它可能不会提供足够的好处值得你花时间。 如果memcached不能满足你的需求,那么你应该转向redis。 无论您需要扩展超过memcached还是需要其他功能,情况都是如此。
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。