12 November 2014

前言

缓存是提高web性能的不二选择。web作为一个分布式的系统,可以添加缓存的地方存在很多,比如:客户端浏览器缓存,缓存服务器,代理缓存,页面缓存,片段缓存,动作缓存,数据层缓存。每个层次的缓存涉及的技术都可以进一步展开。具体操作上,就是客户端js的处理,服务器端Rails的处理,以及数据库端的mysql和mongodb,以上是我目前的理解。

原则上,GET请求是幂等的,因而是可缓存的,但是,如果是动态页面,如果做缓存,又需要做何种处理。

暂且,web缓存是想通过Rails自带的缓存以及Rack提供的缓存的方式,关于缓存的相关知识具体就要参考手头上的《HTTP权威指南》

数据库服务器端,想来参考Robbin的两篇关于ORM的文章:

具体的如何操作,可以参考robin_site

应用场景

需要缓存的地方:

  • 静态页面
  • 无变化的动态页面
  • 动态页面片段
  • 应用程序数据

memcached

分布式操作,不需要考虑ACID,使用缓存。

Rails对缓存的支持很大,memcached可以用在如下的几个方面:

  • ActionController::Caching::Fragments
  • CGI::Session::MemCacheStore
  • cached_model for caching ActiveRecord objects

Rails中的memcached的配置:

require 'memcache'
memcache_options = {
  :compression => false,
  :debug => false,
  :namespace => "app-#{RAILS_ENV}",
  :readonly => false,
  :urlencode => false
}

memcache_servers = [ '192.168.1.150:2222', '192.168.1.150:2223' ]
Rails::Initializer.run do |config|
  ....
  config.action_controller.session_store = :mem_cache_store
  ...
  config.action_controller.fragment_cache_store = :mem_cache_store, memcache_servers, memcache_options
  ...
end
cache_params = *([memcache_servers, memcache_options].flatten)
CACHE = MemCache.new *cache_params
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.merge!({ 'cache' => CACHE })

具体而言,诸如使用了Rails.cache等方法的,缓存存放在memcache中。

Ruby可通过Memcached的client来使用memcache,常见的memcache客户端有:

  • memcache-client
  • dalli

仔细想了想,cache的部分,比之前理解的更深了,却没有好好用,光说不练假把式。

redis

redis更多是是作为数据结构缓存服务器来使用,其性能和缓存的能力都非常的强大。所以,经常用来处理更多的事情。

参考文献

  1. 真实世界中的 Rails: Rails 中的缓存
  2. Rails + Memcached



傲娇的使用Disqus