Redis 复制而不是 RO 从站

标签 redis replication

美好的一天!
假设我们有一个 redis-master 和几个 slave。 master 目标是存储所有数据,slave 用于为用户查询数据。但是查询有点复杂,需要存储一些临时数据。我还想将查询结果缓存几分钟。

我应该如何配置复制以保存临时数据和缓存?

最佳答案

Redis 从站有可选的支持来接受写入,但是在使用它们之前您必须了解可写从站的一些限制,因为它们有一些重要的问题。

  1. 在从服务器上创建的 key 将不支持过期。实际上,在 Redis 的最新版本中,它们似乎 可以工作,但实际上是泄漏而不是过期,直到下次您从头开始重新同步从属与主控或发出 FLUSHALL 或类似命令。这个问题有很深的原因......目前还不清楚我们是否会完全弃用可写从属,找到解决方案,或者拒绝可写从属的过期。
  2. 无论如何,您可能想要使用不同的 Redis 数字数据库(SELECT 命令)来存储您的中间数据(您可以使用 MULTI/.../MOVE/EXEC 事务以在当前选择数据所属的 DB,并将键移到其他某个 DB,因此键是否正在累积将很清楚,您可以不时刷新 FLUSHDB)。
  3. 您在从机上创建的 key 易变,当主机与从机重新同步时,它们可能会在任何时候消失。对你来说看起来不是问题,因为如果他们的 key 不再存在,你可以重新计算,但应该小心,
  4. 如果您将这个从属选为主控,您就会在其中拥有额外的 key 。

所以在这个设置中肯定有一些事情要记住,但它在某种程度上是可行的。但是,您可能需要考虑其他策略。

  1. 从属端的 Lua 脚本,以便在 Lua 中过滤您的数据。通常不如 Redis C 命令快。
  2. 直接在实际数据集中预先计算数据,以便仅使用只读命令即可进行查询。
  3. MIGRATE 以便将有趣的 key 从一个从服务器迁移到一个专门设计用于执行后计算的实例(另一个主服务器)。

如果不深入分析实际用例/问题,很难说出什么是最佳策略,但我希望这个通用指南能有所帮助。

关于Redis 复制而不是 RO 从站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30274322/

相关文章:

Redis 字典搜索 - 带分数的结果

redis - 达到 eta 时,长 eta(8 小时以上)的 celery 任务会连续执行多次

lucene - 搜索索引复制

mysql - 你需要在 mysql 数据库从属上使用触发器吗?

redis - 服务栈.Redis : Unable to Connect: sPort: 0

redis - gitlab 无法保存项目。请稍后再试

go - 如何在 map[string]string 中读取 *redis.Client.TxPipeline.Exec() 方法的响应

node.js - 使用 auth 的 MongoDB/Mongoose 3.x 副本集故障转移/重新连接代码的一个很好的例子是什么?

MySQL 锁定从属数据库

mongodb - 如何决定何时在生产中使用 mongodb 的复制集