Memcached与Redis?
我们正在使用Ruby Web应用程序和Redis服务器进行缓存。 有没有一点要测试Memcached呢?
什么会给我们更好的表现? Redis和Memcached之间有什么优点或缺点?
需要考虑的要点:
总结(TL; DR)
2017年6月3日更新
Redis比memcached更强大,更受欢迎,支持更好。 Memcached只能完成Redis可以完成的一小部分任务。 即使它们的特征重叠,Redis也更好。
对于任何新事物,请使用Redis。
Memcached vs Redis:直接比较
这两种工具都是强大,快速的内存数据存储,可用作缓存。 两者都可以通过缓存数据库结果,HTML片段或其他任何可能需要生成的代价来帮助加速应用程序。
要考虑的事项
当用于同样的事情时,以下是他们如何使用原始问题的“要考虑的要点”进行比较:
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,甚至可以在文档中为每个命令提供实时交互式示例。
现在,memcached的Redis的stackoverflow结果是2x的两倍。 两倍的谷歌结果。 使用更多语言的更容易访问的示例。 更积极的发展。 更积极的客户开发。 这些测量可能没有多少意义,但是它们结合起来可以清晰地显示出对redis的支持和文档更加丰富和更新。
坚持
默认情况下,redis使用称为快照的机制将数据保存到磁盘。 如果你有足够的内存,它可以将所有数据写入磁盘,而性能几乎没有下降。 它几乎免费!
在快照模式下,突然崩溃可能会导致少量数据丢失。 如果您绝对需要确保没有数据丢失,请不要担心,redis会使用AOF(仅附加文件)模式返回。 在这种持久性模式下,数据可以在写入时同步到磁盘。 这可以减少最大写入吞吐量,但是速度可以让您的磁盘写入速度更快,但应该仍然相当快。
如果需要,有很多配置选项可以微调持久性,但默认值非常明智。 通过这些选项可以轻松将redis设置为安全,冗余的数据存储位置。 这是一个真正的数据库。
许多数据类型
Memcached仅限于字符串,但Redis是可以提供多种不同数据类型的数据结构服务器。 它还提供了充分利用这些数据类型所需的命令。
字符串(命令)
简单的文本或二进制值,最大可达512MB。 尽管memcached字符串限于1MB,但这是唯一的数据类型redis和memcached共享。
通过提供按位操作,位级操作,浮点增加/减量支持,范围查询和多键操作的命令,Redis为您提供了更多利用此数据类型的工具。 Memcached不支持任何这一点。
字符串对于各种用例都很有用,这就是为什么memcached对于这种数据类型非常有用。
哈希(命令)
散列有点像键值存储中的关键值存储。 他们映射字符串字段和字符串值。 使用散列的字段 - >值映射比使用常规字符串的键 - >值映射稍微更节省空间。
散列作为命名空间是有用的,或者当你想要在逻辑上分组许多键时。 使用散列,您可以高效地获取所有成员,将所有成员一起过期,一起删除所有成员等。非常适合需要分组的多个键/值对的任何用例。
散列的一个示例用于存储应用程序之间的用户配置文件。 以用户ID作为密钥存储的redis散列将允许您根据需要存储关于用户的尽可能多的数据位,同时将它们保存在单个密钥下。 使用散列而不是序列化配置文件到字符串的好处是,您可以让不同的应用程序在用户配置文件中读取/写入不同的字段,而无需担心一个应用程序会覆盖其他人所做的更改(如果将序列化过期数据)。
列表(命令)
Redis列表是字符串的有序集合。 它们针对列表的顶部或底部(又名:左侧或右侧)插入,读取或删除值进行了优化。
Redis提供了许多用于利用列表的命令,其中包括用于推送/弹出项目的命令,列表之间的推送/弹出,截断列表,执行范围查询等。
列表使得持久的,原子的,队列成为可能。 这些工作适用于作业队列,日志,缓冲区和许多其他用例。
集(命令)
集合是唯一值的无序集合。 它们经过优化,可以让您快速检查某个值是否在集合中,快速添加/删除值以及测量与其他集合的重叠。
这些对访问控制列表,独特的访客跟踪器等许多事情都很有用。 大多数编程语言都有类似的东西(通常称为Set)。 这就是这样,只分发。
Redis提供了几个命令来管理集合。 显而易见的是添加,删除和检查集合。 所以不太明显的命令,比如弹出/读取随机项目以及执行联合和与其他组的交集的命令。
排序集(命令)
排序集也是唯一值的集合。 正如其名称所暗示的那样,这些命令是有序的。 他们按照评分排序,然后按字典顺序排列。
此数据类型经过优化,可通过分数快速查找。 获取其中最高,最低或任何值的范围都非常快。
如果您将用户添加到排序集以及高分中,您就有了一个完美的排行榜。 随着新的高分进入,只需将它们以高分重新添加到集合中,它将重新排列您的排行榜。 对于跟踪上次访问用户和谁在您的应用程序中处于活动状态也非常有用。
用相同的分数存储数值会使它们按照字典顺序排列(按字母顺序排列)。 这可以用于诸如自动完成功能之类的功能。
许多有序的set命令与set的命令类似,有时还有一个额外的score参数。 还包括用于管理分数和按分数查询的命令。
地理
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还是需要其他功能,情况都是如此。
使用Redis if
您需要选择性地删除/过期缓存中的项目。 (你需要这个)
您需要能够查询特定类型的键。 EQ。 'blog1:posts:*','blog2:categories:xyz:posts:*'。 哦耶! 这个非常重要。 使用它可以有选择地使特定类型的缓存项无效。 您也可以使用它来使分段缓存,页面缓存,只有给定类型的AR对象失效等。
持久性(您也需要这样做,除非您可以在每次重新启动后缓存必须预热,对于很少变化的对象来说非常重要)
使用memcached if
根据我的经验,使用Redis的稳定性好于Memcached
Memcached是多线程和快速的。
Redis具有许多功能,速度非常快,但完全局限于一个内核,因为它基于事件循环。
我们使用两者。 Memcached用于缓存对象,主要用于减少数据库的读取负载。 Redis用于像分类集合这样的事物,这些集合对于时间序列数据的卷积非常方便。
链接地址: http://www.djcxy.com/p/34159.html上一篇: Memcached vs. Redis?
下一篇: Node.js, Socket.io, Redis pub/sub high volume, low latency difficulties