当前位置: 首页 > 知识库问答 >
问题:

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

张丁雷
2023-03-14

我对redis是新的,所以我不知道更多关于它复杂的技术细节。但是让我把我的场景放在这里:我在同一个服务器上运行两个网站,我希望redis在这两个网站上工作。在搜索中,我发现可以通过如下所示为同一服务器实例上的不同数据库分配不同的索引来做到这一点:

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

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

这对我来说是理想的,因为我可以在同一个实例中缓存我的两个数据库。但后来我碰到了多个Redis数据库有什么意义?如何在redis数据库之间进行转换?链接上写着“在同一服务器实例中使用多个数据库是不鼓励和不推荐的”。虽然这些链接试图解释它背后的原因,但作为一个初学者,我仍然无法理解它的深层技术层面。

有人能用更简单的术语解释为什么不鼓励使用同一服务器实例的多个redis db的原因吗?此外,简单地说,我如何在没有上述方法的情况下管理同一服务器上的两个网站的缓存

共有1个答案

令狐建修
2023-03-14

如果没有上述方法,我如何在同一台服务器上管理两个网站的缓存?

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

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

更多解决方案请查看此答案。

还要注意,Redis集群不支持多个数据库

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

 类似资料:
  • 我们将redis用于缓存和会话。我希望能够使用分离redis数据库(相同的服务器,只是不同的数据库)为每个情况,以及能够使用相同的服务器生产和预生产。我知道Redis允许您在一台服务器上定义多个数据库(http://www.redisocokbook.org/multiple_databases.html),但是我不知道如何将其翻译成Redis。配置(至少根据文档http://laravel.co

  • 问题内容: 有人告诉我不要在JavaScript中使用数组。为什么不? 问题答案: 原因是一种构造: 有时可能与另一个完全不同: 还请注意,JavaScript库可能会执行以下操作,这会影响您创建的任何数组:

  • 问题内容: 因此,我来​​到了一个地方,我想将存储在Redis中的数据分割到单独的数据库中,因为有时我需要对一种特定类型的数据使用keys命令,并希望将其分离以使其更快。 如果我细分为多个数据库,那么所有内容仍然都是单线程的,而且我仍然只能使用一个内核。如果我只是在同一盒子上启动另一个Redis实例,那么我将使用一个额外的内核。最重要的是,我无法命名Redis数据库,也无法给它们提供任何更逻辑的标

  • 问题内容: 为什么Catch(Exception)一个坏主意? 问题答案: 因为当你捕获异常时,你应该正确处理它。而且,你不能期望在代码中处理所有类型的异常。同样,当你捕获所有异常时,你可能会得到一个无法处理的异常,并阻止堆栈中位于较高位置的代码正确处理它。 一般原则是捕获可能的最特定类型。

  • 如果我分割成多个数据库,所有的东西仍然是单线程的,而且我仍然只能使用一个核心。如果我只是在同一个盒子上启动另一个Redis实例,我将使用一个额外的核心。最重要的是,我不能给Redis数据库命名,也不能给它们任何更符合逻辑的标识符。那么,说完所有这些,为什么/什么时候我会想要使用多个Redis数据库,而不是仅仅为我想要的每个额外数据库构建一个额外的Redis实例呢?与此相关的是,为什么Redis不尝

  • 问题内容: 我有一个Redis实例,其中有两个数据库。现在,我想设置第二个实例并复制第一个实例,但是第二个实例应该仅具有一个数据库,并且仅复制第一个实例中的db 0。当我尝试执行此操作(为第二个实例设置)时,我在Redis日志文件中收到以下错误消息: 我尝试使用redis-dump,但是尝试将生成的转储导入新实例时出现错误。(我认为与2 dbs和1 db无关,而是redis-dump中的一个错误,