3/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。