可能裏面的一些知識已經不被你們使用了,可是做爲學習,我想和你們分享一下我的關於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。