Caching with Rails

参考链接:
https://gist.github.com/xiangzhuyuan/cb1bfb00c5d56583bb5d
https://ruby-china.org/topics/19389
https://ruby-china.org/wiki/rails-caching
https://www.youtube.com/watch?v=eO8tTPDEB8A&index=4&list=WL 等一系列 railscast 视频

这几个链接对 rails cache 说的很详细,看不懂的话可以先多看看视频,然后再去读一遍文章,这样更能理解一些吧。

下面是我初步的一些理解以及初步所能掌握的部分,以后有待完善。


缓存的作用:

避免频繁查询数据库,在最短的时间内把真正需要的内容返回给客户端。(cache是提高应用性能重要的一个环节。)

缓存的使用情境:

经常被访问到的页面,并且页面内容不经常改变,且对时效性要求不是十分严格,或者是,在缓存使用过程中要特别注意真正的内容是否被改变,及时捕捉变化并响应最新的内容。一定要保持缓存和实际记录的一致性。不一致的缓存会导致很多不必要的问题。

如果经常改变内容的页面,可以使用 fresh_when, 这样可以对时效性有更好的控制。如果页面没有敏感信息,可以设置 fresh_when @product, public: true ,这会缓存在一个 public cash。(rack_cache)
这两者也可以结合使用。

需要缓存的地方:

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

MemCacheStore

下面这段是 rails guide 中的说明,由于这个使用较多,就单拿出来记录一下

ActiveSupport::Cache::MemCacheStore

这种存储方式使用 Danga 开发的 memcached 服务器,为程序提供一个中心化的缓存存储。Rails 默认使用附带安装的 dalli gem 实现这种存储方式。这是目前在生产环境中使用最广泛的缓存存储方式,可以提供单个缓存存储,或者共享的缓存集群,性能高,冗余度低。

初始化时要指定集群中所有 memcached 服务器的地址。如果没有指定地址,默认运行在本地主机的默认端口上,这对大型网站来说不是个好主意。

在这种缓存存储中使用 write 和 fetch 方法还可指定两个额外的选项,充分利用 memcached 的特有功能。指定 :raw 选项可以直接把没有序列化的数据传给 memcached 服务器。在这种类型的数据上可以使用 memcached 的原生操作,例如 increment 和 decrement。如果不想让 memcached 覆盖已经存在的记录,可以指定 :unless_exist 选项。

config.cache_store = :mem_cache_store, “cache-1.example.com”, “cache-2.example.com”

gem 'dalli' # Rails 默认使用附带安装的 dalli gem 实现这种存储方式

MemCacheStore 中常用的方法:

1
2
3
4
5
6
7
8
9
10
11
12
Rails.cache.write(:foo, 1) # 写入缓存
Rails.cache.read(:foo) # 从缓存中读取
Rails.cache.read_multi(:foo, :bar) # 一次读取多个
Rails.cache.fetch(:bar) {sleep 1, 2} # 进程sleep 1秒,然后写入2
Rails.cache.fetch('last_post') { Post.last }
Rails.cache.fetch('time', expires_in: 5.seconds) { Time.now } # 缓存现在的时间,5秒后过期
Rails.cache.stats # 可以读取 rails 缓存的状态,比如占用了多少字节,等
Rails.cache.delete # 使某个 key 缓存过期
Rails.cache.exist?
Rails.cache.increment
Rails.cache.decrement
Rails.cache.clear # 清空缓存