繁体   English   中英

我可以将现有的 Redis 用于自定义 Rails 缓存吗?

[英]Can I use my existing Redis for a custom rails cache?

ActiveSupport::Cache::RedisCacheStore文档指出:

注意使用专用的 Redis 缓存,而不是将其指向现有的 Redis 服务器。 它不能很好地应对混合使用模式,并且默认情况下不会使缓存条目过期。

这个建议在一般情况下是否仍然正确,尤其是在谈论自定义数据缓存而不是页面(片段)缓存时?

或者,更具体地说,如果我正在为对缓慢的第 3 方 API 的特定“昂贵”后端调用构建自定义缓存,并且我在缓存(或所有缓存值)上设置了显式expires_in值,那么此建议是否适用于我呢?

TLDR; 是的,只要您设置驱逐政策。 哪一个? 继续阅读。

在同一页面上, #new的文档:

默认情况下,缓存条目没有过期。 Redis 预计将配置一个驱逐策略,该策略会在达到最大 memory 时自动删除最近最少或经常使用的密钥。 有关缓存服务器设置,请参阅 redis.io/topics/lru-cache。

这更多的是关于 memory 管理和访问模式,而不是缓存的内容。 Redis驱逐策略文档有一个关于策略选择和混合使用(是否使用单个实例)的详细部分:

根据应用程序的访问模式选择正确的驱逐策略很重要,但是您可以在应用程序运行时在运行时重新配置策略,并使用 Redis INFO output 监控缓存未命中和命中的数量来调整您的设置。

一般来说,根据经验:

  • 如果您希望请求的受欢迎程度呈幂律分布,请使用allkeys-lru策略。 也就是说,您预计元素子集的访问频率将远高于 rest。 如果您不确定,这是一个不错的选择。

  • 如果您有一个循环访问,其中所有键都被连续扫描,或者当您希望分布均匀时,请使用allkeys-random

  • 如果您希望能够通过在创建缓存对象时使用不同的 TTL 值向 Redis 提供关于什么是好的过期候选者的提示,请使用volatile-ttl

volatile-lruvolatile-random策略主要在您想使用单个实例进行缓存并拥有一组持久键时非常有用。 但是,通常最好运行两个 Redis 实例来解决此类问题。

还值得注意的是,为密钥设置过期值会花费 memory,因此使用诸如allkeys-lru 之类的策略更有效,因为在 ZCD69B4957F08CD8218 压力下不需要expire配置来驱逐密钥。

您没有混合使用。 例如,您不会在 Redis 中保留 Sidekiq 作业,默认情况下它们没有 TTL/到期。 因此,您可以将 Redis 实例视为仅缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM