可能里面的一些知识已经不被你们使用了,可是做为学习,我想和你们分享一下我的关于Rails.cache的浅显的认识,望你们指教。html
它是Rails中的缓存,拥有全部缓存的共同点,它是为了提高网站性能。redis
自己经常使用的有四种,能够根据不一样的环境进行选择不一样的存储系统。数据库
这里我以使用redis来做为Rails.cache的存储系统进行介绍后端
由于是key-value的结构,同时使用redis,可以经过 redis 的命令快速实现,比关系型数据库拥有更快的读写速度,且更适合储存非结构化数据。缓存
配置信息(必须): config.action_controller.perform_caching = true # 确保开启缓存,dev环境下默认是没有开启的。 config.cache_store = :redis_store, { host: 'localhost', port: '6379', db: 1, # 这是整数,能够理解为redis数据库中的表标志,默认是16个数据库,可从0-15中取值 password: '', expires_in: 5.hours # 过时时间的设置 }
production上默认开启了缓存app
development上默认不开启性能
配置方法一(经常使用):学习
# 在development.rb文件中添加 config.action_controller.perform_caching = true # 设置缓存的页面存放的地址(不能修改,默认是public) config.action_controller.page_cache_directory = "#{Rails.root.to_s}/public"
配置方法二(Rails5版本以后开始支持):测试
# 执行任务,会在tmp文件下建立caching-dev.txt和restart.txt文件 rake dev:cache
通过我的测试,二者不能混用,混用存在的问题:
1.若是你使用rake dev:cache,就不能在development.rb中去修改缓存默认存储的地址,一旦修改,缓存就会失效。
2.一旦你是用rake dev:cache来开启缓存,那么就要使用rake dev:cache来关闭缓存(不能经过config.action_controller.perform_caching = false来操做,没法起做用),若是要本身测试,那你必定要首先把以前缓存的文件给删除掉,否则无论你怎么操做,只要public下有该文件,就一直读该文件。网站
若是看一下rake dev:cache的源码,咱们能找到另一种方式来关闭
# 源码 rake任务 namespace :dev do desc "Toggle development mode caching on/off" task :cache do Rails::DevCaching.enable_by_file end end # 源码:经过文件来判断是否开启缓存 FILE = "tmp/caching-dev.txt" def enable_by_file FileUtils.mkdir_p("tmp") if File.exist?(FILE) delete_cache_file puts "Development mode is no longer being cached." else create_cache_file puts "Development mode is now being cached." end FileUtils.touch "tmp/restart.txt" end
因此,很明显,咱们能够经过删除tmp下的restart.txt和cache-dev.txt来关闭缓存。
我的建议:仍是在development.rb文件中本身配置比较灵活
页面缓存
一句话总结:使用缓存的页面来代替action请求对应的页面,这个和缓存系统无关。
默认缓存的文件直接放在public目录下。
页面缓存如今已经被单独做为一个gem,须要在你的Gemfile中加入 gem "actionpack-page_caching"
真正的代码实现:
# 一个控制器 class HuanCunController < ApplicationController # 使用缓存 caches_page :welcome_show # 缓存的页面对应的控制器 def welcome_show end end
welcome_show页面
Hello,welcom!!
current_time_now:<%= Time.now.strftime('%Y-%m-%d %H:%M:%S.%L') %>
没有使用缓存的时候,每次请求的页面都是实时变化的,能够看current_time_now的值。
使用缓存后,会在你配置保存目录的文件下生成对应的静态html文件。
方法缓存
在Gemfile文件中加入gem 'actionpack-action_caching'
为了便于观察,选择redis做为缓存系统。
使用方法缓存的代码以下: class Car::CarsController < ApplicationController caches_action :index def index end end
监控方法:
打开终端,输入redis-cli,而后输入monitor,能够监控redis的存储状况。
调用该index方法,会产生一个key:"get""views/locahost:3003/car/cars"
之后每次再去调用该index,你会发现redis的monitor中都是显示以下信息:说明缓存成功,再也不每次去方法中执行,而是直接从redis中去取。
1560408837.780396 [2 [::1]:54380] "get" "views/localhost:3003/car/cars" 1560408838.140465 [2 [::1]:54380] "get" "views/localhost:3003/car/cars" 1560408838.667096 [2 [::1]:54380] "get" "views/localhost:3003/car/cars"
过时时间的问题:
若是你没有设置过时时间,那么他的过时时间使用redis设置的过时时间。
若是想查看过时时间,进入redis控制台,而后选择你使用的数据库id,例如(查出来的时间是以秒为单位)
myMacBook-Pro redis-cli 127.0.0.1:6379>select 2 OK 127.0.0.1:6379[2]> TTL "views/localhost:3003/car/cars" (integer) 13620 127.0.0.1:6379[2]>=若是想本身设置过时时间,能够直接查看gem 'actionpack-action_caching'这个gem的文档
片断缓存
片断缓存是rails中最经常使用的一种缓存方式,主要是在页面中进行局部缓存。
在index.html.erb页面中 <% cache 'test_index' do %> <%= Time.now.strftime('%Y-%m-%d %H:%M:%S.%L') %> <% end %>
这个其实和方法缓存的监控的方式同样,你会发现会生成"views/car/cars/index:61696bc621e5ee68531c6a58dfaf4da3/test_index"这样的key,同时也能查到过时时间。
每次你去刷新页面,都会在redis中去请求这个key值对应的value值。
若是想本身设置过时时间为2小时,能够这样设置
<% cache 'test_index',expires_in: 2.hours do %> <%= Time.now.strftime('%Y-%m-%d %H:%M:%S.%L') %> <% end %>
若是你想让这个"views/car/cars/index:61696bc621e5ee68531c6a58dfaf4da3/test_index"的key失效,你可使用expire_fragment('views/car/cars/index:61696bc621e5ee68531c6a58dfaf4da3/test_index') ,可是在实际应用中咱们没法查到这个key的具体值,因此咱们能够这样设置:
<% cache 'test_index', {skip_digest: true} do %> <%= Time.now.strftime('%Y-%m-%d %H:%M:%S.%L') %> <% end %>
这样’test_index’将会被做为cache key被缓存起来,若是想要使他失效,只要在对应的action里调用就expire_fragment('test_index')就行,若是不加 {skip_digest: true},那么是没法直接调用expire_fragment('test_index')的。
能够简单的查看一下生成这个片断name的源码:
def cache_fragment_name(name = {}, skip_digest: nil, virtual_path: nil) if skip_digest name else fragment_name_with_digest(name, virtual_path) end end 能够很明显的看出,若是skip_digest是true,将直接返回页面中写的name。