Rails配置memcached缓存

作者:周星 发布:2017-10-07

       本文不会向您介绍 Rails 中缓存的基础内容和 memcached 的缓存策略,所以在阅读本文之前,您需要阅读 [Rails中的缓存](http://guides.rubyonrails.org/caching_with_rails.html) 全部内容。
首先,你需要安装 memcached,您可以使用 [源码安装](http://memcached.org/downloads) ,或者:

# Ubuntu
sudo apt-get install memcached

# centOS or RedHat
yum install memcached

#Mac OS
brew install memcached

安装完执行

memcached -h

如果输出一长串关于 memcached 的参数等信息,说明您已经安装成功了。接下来我们需要修改 Rails 的配置。

首先,设置

config.action_controller.perform_caching = true

默认此值为 false,您需要手动修改它。

想要使用 memcached 作缓存策略,您需要引入一个 gem: dalli ,这个 gem 的命名很有趣,它来自于著名画家 Salvador Dali 的名字,在您的 gemfile 里添加:

gem 'dalli'

然后添加 config/environments/*.rb

config.cache_store = :dalli_store, 'cache-1.example.com', 'cache-2.example.com',
  { :namespace => NAME_OF_RAILS_APP, :expires_in => 1.day, :compress => true }

       这是一个比较全面的例子,它指明了缓存的命名空间、默认过期时间、缓存过大时是否压缩等参数,如果你在 ENV["MEMCACHE_SERVERS"] 使用了第三方的缓存服务,例子中的 'cache-1.example.com' 可以为 nil。

       session 同样可以使用 dalli 保存,您需要修改 config/initializers/session_store.rb,添加类似如下配置,例子中的过期时间为 20 分钟,当然您可以根据具体情况对其修改

Rails.application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 20.minutes

如果您使用了多线程服务器,比如 unicorn、puma,您可以指定一个 dalli 连接池:

config.cache_store = :dalli_store, 'cache-1.example.com', { :pool_size => 5 }

经过如上的配置,您就可以在 Rails 项目中随意使用 Rails.cache 了。

如果您觉得上面的知识有点晦涩,那我们就来真正体验一下好了。

# config/environments/development.rb

config.cache_store = :dalli_store, '127.0.0.1:11211:10',
  { namespace: 'xingishere:rails', expires_in: 30.minutes, compress: true }

在一块静态页面上添加缓存:

<% cache "v1/header/", expires_in: 10.minutes do %>
    <p>这段内容应该被缓存,60分钟后过期</P>
<% end %>

我们在浏览器上访问一下这个页面,然后修改代码,接下来就是见证奇迹的时刻

<% cache "v1/header/", expires_in: 10.minutes do %>
    <h1>你看不到这段文字</h1>
    <p>这段内容应该被缓存,60分钟后过期</P>
<% end %>

刷新界面,是不是还是原来的内容,h1标签内的元素没有出现,这时候我们看一下 Rails 的 log

Cache read: /test_cache ({:expires_in=>3600 seconds})

Cache fetch_hit: /test_cache ({:expires_in=>3600 seconds})

日志告诉我们缓存命中,缓存成功!

在 console 里执行Rails.cache.clear,再刷新页面,就可以看到 h1 标签内的内容。

在本网站,blog 的 show 页面较慢,因为 blog 表字段大量的内容,页面上的喜欢、评论功能需要实时显示,所以我们只缓存 blog 对象即可

@blog = Rails.cache.fetch("/blog/#{params[:id]}", expires_in: 60.minutes) do
  Blog.find_by_url_name(params[:id])
end

以 blog 的 url_name 为缓存的 key,这样就为每一篇博客生成了不同的缓存

友情提示:无法缓存一个 relation 对象,因为它不能被序列化保存到 memcached 中: You are trying to cache a Ruby object which cannot be serialized to memcached 如果你非要这么做,你可以使用页面缓存,或者将 relation 对象 to_a(不推荐)

关于缓存常用的方法很多,本文不再赘述,通过本次分享,您应该可以轻松的在您的 Rails 项目中使用 memcached 缓存了。

如果您对本文有什么意见或建议,请在下方评论或联系博主

支付宝扫码赞助博主


评论(0)