关于 Redis 缓存的更多使用细节?

大家好!

我最近对 Discourse 实例进行了一些负载测试,发现当反复获取同一个评论线程时,Redis 缓存命中率不升反降,这有点出乎意料(在读写混合的情况下,缓存命中率高达 85%,但在 100% 读请求的情况下,命中率最低跌至 22%)。

我在代码库和论坛中搜索了一番,但 Redis 缓存的具体利用方式对我来说仍有些模糊。README 中写道:

我们使用 Redis 作为缓存和临时数据存储。

我使用 redis-cli 转储了上述负载测试期间发送到 Redis 缓存的命令,主要看到了针对计划任务的“get”命令,以及以“__mb_backlog_id_n_”为前缀的键(我相信这指的是 MessageBus 相关功能)。

我有以下几个问题:

  • 是否有“简单”的方法让我在代码库中搜索哪些数据被缓存到了 Redis?我很希望能自己回答这些问题,但遗憾的是,我对 Ruby on Rails 应用(甚至 Ruby 本身)并不太熟悉。:slight_smile:
  • 登录/登出状态是否会影响缓存命中率?供参考,上述负载测试使用的是管理员 API 密钥。
  • 像帖子内容这样经常被查询且相对静态的数据是否会被缓存在 Redis 中?还是说 Redis 主要用于 Sidekiq 等的作业调度和后台处理?

提前感谢!

这是关键点。最激进的缓存策略适用于匿名请求,因此建议您使用一些匿名机器人重试负载测试。

有一些可以通过 grep 搜索的方法,例如 Discourse.cache.fetchDistributedCache.new

我们确实会缓存一些不频繁的配置数据块,但对主题的处理方式主要是为匿名用户缓存整个响应,使应用程序能够在几乎不访问数据库的情况下生成响应。

Redis 被广泛用于 Sidekiq 和 MessageBus。

太棒了,感谢如此有帮助的回复!

我刚刚重新运行了负载测试,但这次使用的是匿名请求,结果性能大幅提升!此前,我们在单台主机上每秒只能处理约 25 个请求,现在可以达到 380 个!Redis 缓存命中率也从约 22% 提升至约 66%。:slight_smile:

特此同步一下结果,以防有人感兴趣。

再次感谢大家的帮助!