我有一个大约 16GB RAM 的 Debian 服务器,它与 nginx 和几个重型 mysql 数据库以及一些自定义 php 应用程序一起使用。我想在 Mysql 和 PHP 之间实现内存缓存,但是数据库太大而无法将所有内容存储在 RAM 中。就我的研究而言,我认为 LRU 缓存可能会更好。这是否排除了 Redis?Couchbase 也是一个考虑因素。
4 回答
假设有一个运行 nginx + php + mysql 实例的唯一服务器并有一些剩余的可用 RAM,使用该 RAM 缓存数据的最简单方法是增加 mysql 实例的缓冲区缓存。数据库已经使用类似 LRU 的机制来处理它们的缓冲区。
现在,如果您需要将部分处理从数据库中移出,那么预缓存可能是一种选择。在谈 memcached/redis 之前,如果只考虑一台服务器(实际上比 redis/memcached 更高效),与 php 集成的共享内存缓存(例如 APC)将是高效的。
memcached和redis都可以考虑进行远程缓存(即各个节点之间共享缓存)。我不会为此排除 redis:它可以很容易地为此目的进行配置。两者都将允许定义内存限制,并以类似 LRU 的行为处理缓存。
但是,我不会在这里使用 couchbase,它是一种弹性(即应该在多个节点上使用)NoSQL 键/值存储(即不是缓存)。您可能可以将一些数据从 mysql 实例移动到 couchbase 集群,但仅将其用于缓存是过度设计 IMO。
我们最初使用 memcached 来缓存数据。在 memcached 中,为不同应用程序在不同存储桶下分区数据是一个真正的问题。此外,我们需要仅从一个存储桶中刷新数据。监控数据是另一个要求。我们搬到了 Couchbase 并使用了 memcache 风格的存储桶。我想使用 Couchbase memcache 风格的存储桶进行缓存而不是使用 memcached 会更加灵活和高效。
正如 Matt Ingenthron 所指出的和 Hari 所指出的,Couchbase 支持作为 Memcached 的直接替代品。Couchbase 以非弹性方式利用 memcached,因为参与 memcache 集群的每个节点都是谨慎的,没有持久性,即只是一个缓存,但 couchbase 还提供确实提供持久性的“Couchbase”存储桶类型。Membase 也是代码的一部分,因此 Couchbase 不仅从磁盘提供数据,还从 RAM 提供数据,并将其保存在那里,同时复制到其他节点并在应用更改时保存到磁盘。我强烈推荐 Couchbase 3.x 在一个足迹中进行缓存和持久性,或者如果您只想要一个与持久性层分开的缓存层,则可以使用多个足迹。
您是否考虑过使用具有持久性的内存中 NoSQL 解决方案之一将您的数据库完全移动到 RAM?它可能比原始 MySQL 数据库占用更少的存储空间,因为许多 NoSQL 解决方案通常比 SQL 数据库占用更少的空间。此外,如果服务器端逻辑对您来说非常重要,请尝试使用 Tarantool,因为它具有板载 Lua 脚本,并且内存占用应该非常小。在我的情况下,Tarantool 中的相同数据占用的数据比 MySQL 中的少两倍。这是因为它们每行和每个字段的开销很小,并且使用消息包进行数据存储。