我是否可以将现有的 Redis 用于自定义 rails 缓存?



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

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

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

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

TLDR;是的,只要您设置了逐出策略。哪一个?请继续阅读。

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

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

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

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

一般来说,根据经验:

  • 当您期望在请求的受欢迎程度中出现幂律分布时,请使用allkeys-lru策略。也就是说,您期望元素子集的访问频率远远高于其他元素。如果您不确定,这是一个不错的选择。

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

  • 如果您希望能够在创建缓存对象时使用不同的 TTL 值向 Redis 提供提示,说明什么是过期的良好候选项,请使用易失性 ttl

当您希望将单个实例用于缓存和拥有一组持久密钥时,易失性 lru易失性随机策略主要有用。但是,运行两个 Redis 实例来解决此类问题通常是一个更好的主意。

还值得注意的是,将过期值设置为密钥会消耗内存,因此使用allkeys-lru等策略可以提高内存效率,因为在内存压力下不需要对要逐出的密钥进行expire配置。

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

最新更新