美好的一天!
假设我们有一个 redis-master 和几个 slave。 master 目标是存储所有数据,slave 用于为用户查询数据。但是查询有点复杂,需要存储一些临时数据。我还想将查询结果缓存几分钟。
我应该如何配置复制以保存临时数据和缓存?
最佳答案
Redis 从站有可选的支持来接受写入,但是在使用它们之前您必须了解可写从站的一些限制,因为它们有一些重要的问题。
- 在从服务器上创建的 key 将不支持过期。实际上,在 Redis 的最新版本中,它们似乎 可以工作,但实际上是泄漏而不是过期,直到下次您从头开始重新同步从属与主控或发出 FLUSHALL 或类似命令。这个问题有很深的原因......目前还不清楚我们是否会完全弃用可写从属,找到解决方案,或者拒绝可写从属的过期。
- 无论如何,您可能想要使用不同的 Redis 数字数据库(SELECT 命令)来存储您的中间数据(您可以使用 MULTI/.../MOVE/EXEC 事务以在当前选择数据所属的 DB,并将键移到其他某个 DB,因此键是否正在累积将很清楚,您可以不时刷新 FLUSHDB)。
- 您在从机上创建的 key 易变,当主机与从机重新同步时,它们可能会在任何时候消失。对你来说看起来不是问题,因为如果他们的 key 不再存在,你可以重新计算,但应该小心,
- 如果您将这个从属选为主控,您就会在其中拥有额外的 key 。
所以在这个设置中肯定有一些事情要记住,但它在某种程度上是可行的。但是,您可能需要考虑其他策略。
- 从属端的 Lua 脚本,以便在 Lua 中过滤您的数据。通常不如 Redis C 命令快。
- 直接在实际数据集中预先计算数据,以便仅使用只读命令即可进行查询。
- MIGRATE 以便将有趣的 key 从一个从服务器迁移到一个专门设计用于执行后计算的实例(另一个主服务器)。
如果不深入分析实际用例/问题,很难说出什么是最佳策略,但我希望这个通用指南能有所帮助。
关于Redis 复制而不是 RO 从站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30274322/