我对 Memcache 和 Redis 有点陌生,我想了解两者之间的区别以及它们的实际含义。
正如向我解释的那样,Memcache 是一种数据库缓存解决方案。来自频繁运行的查询的数据被缓存起来,以便稍后重新使用,从而加快响应时间。这样描述准确吗?
雷迪斯呢?这是否以类似的方式工作?换句话说,它是否缓存从后端数据库接收到的数据?我一直读到 Redis 是一种键值存储解决方案,对我来说这听起来更像是数据库服务器与数据库缓存解决方案的替代品。
任何帮助理解每个是什么以及差异是什么将不胜感激。
谢谢布拉德
Memcached 是内存中的键/值存储。Redis 可以这样使用,但远不止于此。
Memcached 和 Redis 的相似之处
两者都能够缓存数据库结果或您可能想要缓存的任何其他内容。
两者都能够为键存储简单的字符串值。之前的回答说 memcached 更灵活,这是错误的。将“任何你想要的”存储到 memcached 中涉及获取对象并将它们序列化/编组为字符串。Redis 同样支持这一点。Redis 通常更灵活,即使在存储序列化对象时也是如此,因为默认的最大值大小要大得多(1MB 对 512MB)。
两者都将值存储在内存中并且非常快速和高效,通常会在网络带宽或内存 I/O 上出现瓶颈,而不会占用大量 CPU。两者都是高度可扩展的。两者都有很好的管理和监控工具。两者都存在商业集群解决方案。从 3.0 开始,redis 包括内置的集群支持,而 memcached 不提供。
实际上,redis 可以同样好地解决 memcached 的每个用例,有时甚至更好。Memcached 是一款出色的软件,但它的特性和优势都已成为 Redis 的一个子集。
Redis 超集
它们的不同之处在于 redis 提供的大量附加功能,以及这些功能支持的附加用例。
Redis 不仅仅是一个键/值存储。它是一个内存数据结构服务器。可以为键分配简单的字符串,就像在 memcached 中一样,但它们也可以存储哈希、列表、集合或有序集合。这些额外的数据类型是高效和优化的,有许多命令可以利用它们,从而实现简单键/值存储所不提供的访问模式。
Redis 提供persistence、 built-in 和默认开启。这意味着默认情况下,redis 是一个真正的数据库,而不是像 memcached 这样的简单易失性缓存。当您重新启动时,您的数据将在那里。您可以使用许多简单的管理选项来调整持久性以最好地解决您的用例,或者如果您想要的只是易失性缓存,则将其关闭。
Redis 提供发布/订阅(Publish/Subscribe)。这允许您创建频道并让一个或多个客户端订阅它们,从而实现高效的高速实时通信机制。对于进程间、应用程序间或服务器间通信,这可能是一个很好的解决方案。
Redis 提供Lua 脚本支持。这使您可以做各种新事物。一个重要的例子是原子地执行几个依赖的 redis 命令,并且只调用一次 redis。Lua 脚本很容易上手,并且脚本可以高效且原子地运行。
结论
除非您的项目已经在使用 memcached 或者您的组织在 memcached 上有大量投资,否则您不应该使用它。Redis 在自己的游戏中与 memcached 竞争,并启用了一个全新的世界。即使您的问题可以通过这两种工具同等解决,也请选择为您还无法预见的问题提供更大灵活性的工具:redis。您还将选择开发和维护更积极、改进更快的工具。Memcached 不会也不应该去任何地方,但是很难证明它被用于任何新事物,除非您对 memcached 有大量的知识或基础设施投资。
如果您已经在使用 memcached,那么切换到 redis 可能需要做很多工作而收效甚微。仔细评估 redis 并根据您的情况决定切换的成本是否超过收益。如果是这样,请坚持使用 memcached。它仍然是一款出色、稳定、坚固的软件。
两者之间确实存在一个关键区别。
两者都可以被操纵成缓存任何你想扔给它们的东西。这些系统和许多其他类似系统的最终目标是提供分布式内存缓存,以更快地存储您需要访问的任何数据。这实质上将数据库降级为一个简单的数据存储库,用于持久和长期存储,而内存缓存机制将尽可能多的数据卸载并移动到堆栈的前端,从而减少延迟和检索时间数据。
正如您所指出的,Redis 实际上只是用于键和值缓存,但是我以前见过存储整个对象。但是,它确实有助于提高数据库性能。
Memcached 更灵活一些,因为它几乎可以存储您想要的任何内容。它也是任何分布式内存缓存应用程序的顶级竞争者之一。还有其他系统也可以这样做。
无论哪种方式,都必须编写软件来加载这两个缓存中的任何一个。某些现有软件可能出于您想到的任何目的而存在,例如将表格加载到内存中,但这些软件对于每种情况都是特定的。