翻译 Ruby on Rail Guides: ActiveSupport::Cache::RedisCacheStore

088pause · 2020年04月27日 · 最后由 xiaox 回复于 2022年11月11日 · 3506 次阅读

今天浏览到 Ruby on Rail 指南中文版 Rails 缓存概览,发现缺失了 Guides 中新增的这一节,顺手翻译发出来供大家参考。

2.6 ActiveSupport::Cache::RedisCacheStore

使用 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 }
  }
}

让它用起来就像一台内存缓存服务器一般 (allowing it to behave much like a Memcached cache server.)

今日回看才发现这个翻译是错的……由于之前从来没用过 Memcached 作为缓存服务器,中文版这段看的也不仔细,就直接翻译成了缓存服务器。😂 更新了一下。

2.5 ActiveSupport::Cache::MemCacheStore

这个缓存存储器使用 Danga 的 memcached 服务器为应用提供中心化缓存。Rails 默认使用自带的 dalli gem。这是生产环境的网站目前最常使用的缓存存储器。通过它可以实现单个共享的缓存集群,效率很高,有较好的冗余。

搜索的时候查到这篇文章 -> Redis vs. Memcached: In-Memory Data Storage Systems

发现作者是 Alibaba Cloud,原来阿里云在 Medium 上还有官方账号呢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号