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