为什么在同一个实例中使用多个数据库在 Redis 中不是一个好主意?

Why using multiple database in same instance a bad idea in Redis?

我是redis的新手,所以我不太了解它的复杂技术。但是让我把我的场景放在这里:我是来自同一台服务器的 运行 两个网站,我希望 Redis 在这两个网站上都能工作。在搜索时,我发现我可以通过为同一服务器实例上的不同数据库分配不同的索引来做到这一点,如下所示:

//In my first website (development)
Idatabase dbOfDev=_conn.GetDatabase(0);

//In my second website (production)
Idatabase dbOfProd=_conn.GetDatabase(1);

这对我来说非常理想,因为我可以在同一个实例中缓存我的两个数据库。但后来我碰到了 What's the Point of Multiple Redis Databases? and How do I change between redis database? 链接,上面写着 "Use of multiple database in same server instance is discouraged and deprecated"。虽然这些链接确实试图解释其背后的原因,但作为初学者,我仍然无法理解其深层技术方面。

任何人都可以用更简单的术语解释为什么不鼓励使用同一服务器实例的多个 redis 数据库的原因。另外,简单来说,如果没有上述方法,我如何在同一台服务器上管理我的两个网站的缓存?

how can I manage caching of both my websites on same server without the above said approach?

您可以为每个网站使用不同的关键标签。比如,将这两个网站命名为 AB。对于网站 A 的所有键,给每个键一个前缀(键标记):A:。另一方面,给网站 B 的每个键另一个前缀:B:。这样,您就可以为每个网站拥有唯一的密钥命名空间。

SET A:key1 val1
SET A:key2 val2
LPUSH B:key1 1
SADD B:key2 val

另请检查 以获得更多解决方案。

Can anyone explain the reason in simpler terms as why using multiple redis db of same server instance is discouraged.

AFAIK,多数据库功能 NOT 不鼓励和 弃用。这是一种为不同应用程序隔离关键命名空间的方法。然而,Redis 的作者 考虑 Redis 多数据库错误是我在 Redis 设计中最糟糕的决定 all,因为它使 Redis 内部结构更加复杂。

Redis是单线程,所以相对于多个数据库,多个Redis实例可以发挥多核的优势。如果你在一个 Redis 实例中有多个数据库,你仍然可以只使用一个核心。而且Redis实例本身的内存占用很小,所以你不用担心多个Redis实例会花费你太多。

Redis 非常快,通常瓶颈是网络带宽,不是 CPU。所以通常你不能通过使用多个 Redis 实例获得太多收益。但是,如果您的某个应用程序需要在 Redis 上执行一些慢速命令,并且不希望它阻塞其他应用程序,您可以为 slow 应用程序提供一个单独的 Redis 实例,并且为其他 fast 应用程序准备另一个 Redis 实例。

另请注意,Redis 集群不支持多数据库。

就个人而言,我喜欢这个多数据库功能。通常,如果我 运行 一个 Redis 实例,而不是 Redis 集群,我会将我的数据放入默认数据库以外的某个数据库中,即数据库 0,以避免偶然登录 Redis 并在默认数据库上做一些可怕的事情.此外,使用多个数据库实现双缓冲区也非常容易,例如将数据写入新数据库,完成后,使用SWAPDB命令自动高效地交换旧数据库和新数据库。

不是。如果你正在构建一个多租户应用程序,支持多个网站,它确实有意义。如果其中一个网站需要更快地扩展,您可以单独为该网站设置一个不同的实例(或集群),并且迁移要简单得多。