什么是多个Redis数据库的重点?
所以,我已经到了一个地方,我想将存储在redis中的数据分割成不同的数据库,因为我有时需要使用keys命令来处理一种特定types的数据,并且希望将其分开以使其更快。
如果我分成多个数据库,一切仍然是单线程的,我仍然只能使用一个核心。 如果我只是在同一个盒子上启动另一个Redis实例,我可以使用一个额外的核心。 最重要的是,我不能命名Redis数据库,或给他们任何更多的逻辑标识符。 所以,所有这一切说,为什么/我什么时候会想要使用多个Redis数据库,而不是为每个额外的数据库旋转额外的Redis实例? 相关地,为什么Redis不尝试为每个额外的数据库添加一个额外的内核? 单线程跨数据库有什么优势?
原则上,同一实例上的Redis数据库与RDBMS数据库实例中的模式没有区别。
所以,所有这一切说,为什么/我什么时候会想要使用多个Redis数据库,而不是为每个额外的数据库旋转额外的Redis实例?
在同一个redis实例中使用redis数据库有一个明显的优势,那就是pipe理。 如果您为每个应用程序启动一个单独的实例,并假设您有3个应用程序,那么就是3个单独的redis实例,每个实例都可能需要一个HA的从属服务器,因此总共有6个实例。 从pipe理的angular度来看,这是非常麻烦的,因为你需要监控所有这些,做升级/补丁等等。如果你不打算用高I / O来重载redis,那么带有slave的单个实例更简单,如果符合您的SLA,则更易于pipe理。
您不希望在单个redis实例中使用多个数据库。 它已被弃用,正如您所说,多个实例可以让您利用多个核心。 如果你使用数据库select,你将不得不在升级时重构。 监视和pipe理多个实例并不困难也不痛苦。
事实上,通过基于实例的隔离,你可以在每个数据库上获得更好的指标。 每个实例将具有反映该数据段的统计数据,这可以实现更好的调整和更加灵敏和准确的监视。 使用最新的版本,并通过实例分隔您的数据。
正如Jonaton所说,不要使用他的键盘命令。 如果你只是创build一个关键的索引,你会发现更好的性能。 每当添加一个密钥,将密钥名称添加到一个集合。 一旦你放大了,keys命令并不是非常有用,因为它需要大量的时间才能返回。
让访问模式决定如何构build您的数据,而不是像您认为的那样存储数据,然后解决以后如何访问和剔除数据。 你会看到更好的性能,并发现数据消费代码往往是更清洁,更简单。
关于自从线程,认为redis是为速度和primefaces性而devise的。 在一个数据库中修改date的确定操作不需要等待另一个数据库,但是如果该操作正在保存到转储文件或从属处理事务呢? 在这一点上,你开始进入并发编程的杂草。
通过使用多个实例,您可以将multithreading复杂性转换为更简单的消息传递样式系统。
即使Salvatore Sanfilippo(Redis的创build者)也认为在Redis中使用多个数据库是一个糟糕的主意。 在这里看到他的评论:
https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion
我明白这可能是有用的,但不幸的是,我认为Redis的多个数据库错误是我在Redisdevise中最糟糕的决定……没有任何真正的收益,它使内部更复杂。 实际情况是,数据库不能很好地扩展,比如密钥和虚拟机的活动失效。 如果数据库select可以用string执行,我可以看到这个特性被用作一个可扩展的O(1)字典层,而不是。
有了DB号码,默认情况下有几个DB,我们可以更好地沟通这个function是什么,以及我想怎么使用这个function。 我希望在某种程度上我们可以放弃多个数据库的支持,但是我认为可能已经太晚了,因为有很多人依靠这个function来工作。
-
我真的不知道在一个实例上有多个数据库的好处。 如果多个服务使用相同的数据库服务器,我想这很有用,所以你可以避免重要的冲突。
-
我不会build议围绕使用
KEYS
命令进行构build,因为它是O(n),并且不能很好地扩展。 你用什么来达到另一种目的呢? 如果像KEYS
这样的function是至关重要的话,redis可能不是最适合你的。 -
我想他们在常见问题解答中提到单线程服务器的好处,但最主要的是简单性 – 您不必以任何实际的方式打扰并发。 每个动作都被阻塞,所以没有两件事情可以同时改变数据库。 理想情况下,每个服务器的每个核心会有一个(或多个)实例,并使用一致的哈希algorithm(或代理)来将密钥分配给它们。 当然,你会失去一些function – pipe道只能在同一台服务器上工作,sorting变得更加困难等等。
Redis数据库可用于部署新版本应用程序的罕见情况,其中新版本需要与不同的实体一起工作。
我使用redis来实现黑名单的电子邮件地址,而且我对不同级别的黑名单有不同的TTL值,所以在同一个实例上有不同的DB可以帮助我很多。