今天浏览到 Ruby on Rail 指南中文版 Rails 缓存概览,发现缺失了 Guides 中新增的这一节,顺手翻译发出来供大家参考。
使用 Redis 作为缓存存储,可以利用其支持到达最大内存时自动淘汰/失效的优势,让它得以拥有如一台 Memcached 缓存服务器般的性能。
部署备注:Redis 不会默认删除过期主键,所以使用一台 Redis 缓存专用服务器时要小心。避免爆炸式地塞满你的持久化 Redis 服务器!认真仔细地查看这篇Redis 缓存服务器搭建指南。
对于一台缓存专用 Redis 服务器,应把maxmemory-policy
设置为 allkeys 的几个变体之一。Redis 4+ 支持最近最少使用淘汰(allkeys-lfu
),这是非常好的默认之选。Redis 3 及更早的版本,应该选择最久未使用淘汰(allkeys-lru)。
把缓存读写超时(cache read and write timeouts)设置的相对低些。重新生成一遍缓存值通常比花费一秒钟去找回它更快。读和写的超时阈值默认都是 1 秒,但应该设的更低些,如果其实你的网络通常处于低延迟的话。
默认情况下,如果在请求期间连接失败,缓存存储将不会尝试重新连接到 Redis。如果您经常断开连接,可能会希望启用重连尝试。
缓存读取和写入并不会引发异常;它们只是返回nil
,就像缓存中什么也没有时一样。为了及时获知您缓存遇到异常,您可以提供一个error_handler
来报告给异常收集服务。它必须接受三个关键字参数:method
,原始调用的缓存存储方法;returning,返回给用户的值,通常就是 nil
;以及exception
,所发生的异常。
准备开始吧,首先把 redis gem 添加到你的 Gemfile:
gem 'redis'
你可以启用 hiredis 库以获得更快的连接,只要把它的 Ruby 封装版本添加 Gemfile 就行:
gem 'hiredis'
如果可用的话,Redis 缓存存储会自动链接和使用 hiredis。不需要进一步的设置。
最后,在相关配置文件 config/environments/*.rb
中添加设置:
config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'] }
一个更复杂的,生产环境下的 Redis 缓存存储可能是这样的:
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 }
}
}