β

Rails 5.2 的 Redis Cache Store

脱线道士维克多 123 阅读

过去想在 Rails 中使用 redis 当作 cache store 的话需要使用 redis-rails gem。而 Rails 5.2 之后已经内置类 redis cache store 类型,可以用来处理 fragment cache。

需要注意的是内置的 redis cache store 无法处理 Session 和 HTTP Cache,所以说这一点是不如 redis-rails 的。

抛弃 redis-rails 的另外一个原因是,Rails 5.2 支持 write_multi 只有使用内置的 cache store 才能很好的使用新方法。

功能

使用

gem 'redis'
gem 'hiredis', '~> 0.6.1'

不需要配置 Redis cache store 会自动尝试使用更快的 hiredis。

# config/environments/*.rb
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'] }

产品环境下可能配置会比较复杂

cache_servers = %w(redis://cache-01:6379/0 redis://cache-02:6379/0)
config.cache_store = :redis_cache_store, { url: cache_servers,

  connect_timeout:    30,  # Defaults to 20 seconds
  read_timeout:       0.2, # Defaults to 1 second
  write_timeout:      0.2, # Defaults to 1 second
  reconnect_attempts: 1,   # Defaults to 0

  error_handler: -> (method:, returning:, exception:) {
    # Report errors to Sentry as warnings
    Raven.capture_exception exception, level: 'warning',
      tags: { method: method, returning: returning }
  }
}

ActiveSupport::Cache::Store 本身就支持的参数仍然有效。

详见这里

同样也可以配置多个 Redis Server,注意下面的 driver: :hiredis 参数是多余的。

redis_servers = %w[
  redis://localhost:6379/0
  redis://localhost:6380/0
  redis://localhost:6381/0
]

config.cache_store = :redis_cache_store, { driver: :hiredis, url: redis_servers }

一些注意事项

redis 和 memcached 一样都会在满了之后自动回收旧对象空间。

处理异常

缓存读取和写入从不引发异常,只会返回 nil 看起来就像没有缓存。为了发现缓存的异常,可以使用 error_handler 来向异常收集服务发送报告,比如 Log 或者 newrelic。

该方法接收3个关键字参数: method 最初调用缓存方法的方法名; returning 返回给用户的值,通常为 nil exception 捕获的异常。

相关链接

作者:脱线道士维克多
原文地址:Rails 5.2 的 Redis Cache Store, 感谢原作者分享。

发表评论