我们正在将带Redis服务器的Ruby Web应用程序用于缓存。有没有要测试Memcached的地方呢?
什么会给我们带来更好的性能?Redis和Memcached之间有什么优缺点?
要考虑的要点:
2017年6月3日更新
与memcached相比,Redis功能更强大,更受欢迎并且得到更好的支持。Memcached只能做Redis可以做的一小部分。即使Redis的功能重叠,Redis也更好。
对于任何新内容,请使用Redis。
两种工具都是功能强大,快速的内存中数据存储,可用作缓存。两者都可以通过缓存数据库结果,HTML片段或其他可能产生成本很高的内容来帮助加快应用程序的速度。
当用于同一事物时,以下是它们如何使用原始问题的“要考虑的要点”进行比较:
Memcached是一个简单的易失性缓存服务器。它允许您存储键/值对,其中值限制为最大1MB的字符串。
擅长此事,但仅此而已。您可以通过它们的键以极高的速度访问这些值,这通常会使可用的网络或什至是内存带宽饱和。
重新启动内存缓存后,您的数据不见了。这对于缓存很好。您不应该在其中存储任何重要内容。
如果您需要高性能或高可用性,则可以使用第三方工具,产品和服务。
Redis可以完成与memcached相同的工作,并且可以做得更好。
Redis也可以充当缓存。它也可以存储键/值对。在redis中,它们甚至可以达到512MB。
您可以关闭持久性,并且在重新启动时也很可能会丢失数据。如果您希望缓存能够继续运行,那么重新启动也可以。实际上,这是默认设置。
它也非常快,通常受网络或内存带宽的限制。
如果一个redis /memcached实例的性能不足以满足您的工作负载,那么redis是不二之选。Redis包括集群支持,并附带了“在盒子里”的高可用性工具(redis- sentinel)。在过去的几年中,redis也已成为第三方工具的明确领导者。RedisLabs,Amazon等公司提供许多有用的Redis工具和服务。Redis周围的生态系统更大。现在,大规模部署的数量可能会大于内存缓存的数量。
Redis不仅仅是一个缓存。它是一个内存中的数据结构服务器。在下面,您将快速概览Redis可以做的事情,而不仅仅是像memcached这样的简单键/值缓存。Redis的 大多数 功能都是memcached无法做到的。
Redis的文档比memcached的文档更好。尽管这可能是主观的,但它似乎一直在越来越真实。
redis.io是一个很棒的易于导航的资源。它使您可以在浏览器中尝试redis,甚至还可以通过文档中的每个命令为您提供实时的交互式示例。
现在,redis的堆栈溢出结果是内存缓存的2倍。是Google结果的2倍。提供更多语言的更易于访问的示例。更积极的发展。更积极的客户开发。这些度量可能并没有太大的意义,但结合起来可以清楚地看到,有关Redis的支持和文档越来越多,而且是最新的。
默认情况下,redis使用称为快照的机制将数据持久保存到磁盘。如果您有足够的可用RAM,则可以将所有数据写入磁盘,而性能几乎不会降低。它几乎是免费的!
在快照模式下,突然崩溃可能会导致少量数据丢失。如果您绝对需要确保没有任何数据丢失,请放心,redis也使用AOF(仅附加文件)模式支持您。在这种持久模式下,数据可以在写入时同步到磁盘。这样可以将最大写入吞吐量降低到磁盘可以写入的速度,但是仍然应该非常快。
如果需要,有许多配置选项可以微调持久性,但是默认设置非常明智。这些选项使将Redis设置为安全,冗余的数据存储位置变得容易。这是一个 真实的 数据库。
Memcached仅限于字符串,但是Redis是一个数据结构服务器,可以提供许多不同的数据类型。它还提供了充分利用这些数据类型所需的命令。
简单文本或二进制值,最大可为512MB。这是唯一的数据类型redis和memcached共享,尽管memcached字符串限制为1MB。
Redis通过提供用于按位操作,位级别操作,浮点增量/减量支持,范围查询和多键操作的命令,为您提供了更多利用此数据类型的工具。Memcached不支持任何一种。
字符串对于各种用例都是有用的,这就是为什么memcached仅对这种数据类型有用。
哈希有点像键值存储中的键值存储。它们在字符串字段和字符串值之间映射。使用散列的Field-> value映射比使用常规字符串的key->value映射在空间效率上略高。
散列可用作名称空间,或者在逻辑上将许多键分组时很有用。使用散列,您可以有效地捕获所有成员,一起使所有成员过期,一起删除所有成员,等等。对于需要将多个键/值对进行分组的用例而言,它非常有用。
哈希的一种示例用法是在应用程序之间存储用户配置文件。使用用户ID作为密钥存储的redis哈希将允许您根据需要存储有关用户的数据,同时将其存储在单个密钥下。使用散列而不是将配置文件序列化为字符串的优点是,您可以让不同的应用程序在用户配置文件中读/写不同的字段,而不必担心一个应用程序覆盖其他应用程序所做的更改(如果您将陈旧序列化,则会发生这种情况数据)。
Redis列表是字符串的有序集合。它们经过优化,可从列表的顶部或底部(又名:左侧或右侧)插入,读取或删除值。
Redis的提供许多命令为利用列表,包括命令到压入/弹出的项目,推/列表,截断列表之间弹出,执行范围查询等
列表使持久的,原子的队列成为可能。这些非常适合作业队列,日志,缓冲区和许多其他用例。
集是唯一值的无序集合。它们经过优化,可让您快速检查值是否在集合中,快速添加/删除值,以及测量与其他集合的重叠。
这些功能非常适合访问控制列表,唯一的访客跟踪器以及许多其他功能。大多数编程语言都有类似的东西(通常称为Set)。就是这样,只有分布式。
Redis提供了一些命令来管理集合。存在诸如添加,删除和检查集合之类的显而易见的内容。因此,不太明显的命令(例如弹出/读取随机项)以及用于执行与其他集合的并集和交集的命令。
排序集也是唯一值的集合。顾名思义,这些是有序的。它们按分数排序,然后按字典顺序排序。
此数据类型经过优化,可按分数快速查找。获得最高,最低或介于两者之间的任何值都非常快。
如果将用户以及他们的高分添加到排序的集合中,则您将拥有一个完美的排行榜。随着新的高分出现,只需将他们的高分再次添加到集合中,它将重新排列排行榜。也非常适合跟踪用户上次访问的时间以及谁在您的应用程序中处于活动状态。
存储具有相同分数的值会使它们按字典顺序(按字母顺序思考)排序。这对于自动完成功能等很有用。
许多排序的set 命令类似于set 命令,有时带有附加的score参数。还包括用于管理分数和按分数查询的命令。
Redis的具有几个命令用于存储,检索,以及测量的地理数据。这包括半径查询和测量点之间的距离。
从技术上讲,Redis中的地理数据存储在排序集中,因此这不是真正的独立数据类型。它更多地是对排序集的扩展。
像geo一样,这些也不是完全独立的数据类型。这些命令使您可以将字符串数据视为位图或超级日志。
位图是我在Strings下面引用的位级运算符的作用。这种数据类型是reddit最近的合作艺术项目r / Place的基本构建块。
Strings
HyperLogLog允许您使用恒定的极少量空间以惊人的精度计算几乎无限的唯一值。仅使用〜16KB,您就可以有效地计算网站唯一身份访问者的数量,即使该数量是数百万。
Redis中的命令是原子性的,这意味着您可以确保在向Redis写入值后,该值对于连接到Redis的所有客户端都是可见的。无需等待该值传播。从技术上讲,memcached也是原子的,但是redis在memcached之外添加了所有这些功能,值得注意的是,所有这些其他数据类型和功能也是原子的。
尽管与关系数据库中的事务不太相同,redis也具有使用“乐观锁定”的事务(WATCH / MULTI / EXEC)。
Redis提供了一个称为“ 流水线 ” 的功能。如果要执行许多redis命令,则可以使用流水线将它们一次发送一次,而不是一次发送到redis。
通常,当您执行命令以进行redis或memcached时,每个命令都是一个单独的请求/响应周期。使用流水线,redis可以缓冲多个命令并一次执行所有命令,并在一次回复中对所有命令的所有响应进行响应。
这可以使您在批量导入或涉及许多命令的其他操作上获得更大的吞吐量。
Redis具有专用于发布/订阅功能的命令,从而允许Redis 充当高速消息广播者。这允许单个客户端将消息发布到连接到通道的许多其他客户端。
Redis可以执行发布/订阅以及几乎所有工具。像RabbitMQ这样的专用消息代理可能在某些方面具有优势,但是事实是,同一台服务器还可以为您提供持久的持久队列以及您的发布/订阅工作负载可能需要的其他数据结构,Redis通常被证明是最好,最简单的工具为了工作。
您可以想到lua脚本,例如redis自己的SQL或存储过程。它的大小不一,但这个类比大都可行。
也许您希望redis执行复杂的计算。也许您负担不起事务回滚,需要保证复杂过程的每一步都将自动发生。这些问题以及更多问题可以通过lua脚本解决。
整个脚本是原子执行的,因此,如果您可以使逻辑适合lua脚本,则通常可以避免混淆乐观的锁定事务。
如上所述,redis包括对集群的内置支持,并与自己的称为的高可用性工具捆绑在一起redis-sentinel。
redis-sentinel
毫不犹豫地,对于任何新项目或尚未使用memcached的现有项目,我建议在memcached上使用redis。
以上听起来像我不喜欢memcached。相反:它是一个功能强大,简单,稳定,成熟和强化的工具。甚至在某些用例中,它比redis快一点。我喜欢记忆快取。我只是认为这对未来的发展没有多大意义。
Redis可以做memcached所做的一切,通常更好。memcached的任何性能优势都是次要的且特定于工作负载。还有一些工作量的Redis会更快,而Redis可以做的事情更多,而Memcached根本做不到。面对功能上的巨大鸿沟,微小的性能差异似乎微不足道,而且两个工具是如此之快和高效,它们很可能成为基础架构的最后一部分,您将不必担心扩展。
只有一种情况使memcached更有意义:将memcached用作缓存。如果您已经使用memcached进行缓存,请在满足您需要的情况下继续使用它。迁移到Redis可能不值得,并且如果您仅将Redis用于缓存,则可能无法提供足够的好处,值得您花时间。如果memcached不能满足您的需求,那么您可能应该改用Redis。无论您需要扩展到内存缓存之外还是需要其他功能,这都是事实。