última modificação •O browser mantém uma cópia local •Para cada requisição feita para o servidor, o browser informa a data da cópia local •Se o servidor não possuir uma versão mais recente, retorna 304 (not modified) Quando Os Recursos São Simples. Sem Aninhamento Ou Agregações;
conteúdo •O browser mantém uma cópia local e o hash •Para cada requisição feita para o servidor, o browser informa o hash da cópia local •Se o servidor não possuir um hash diferente do conteúdo, retorna not modified (304) Quando Os Recursos São Mais Complexos; Aninhamento E Agregação;
banco (4) CONTROLLER 1 class ChartsController < ApplicationController 2 def index 3 if stale?(last_modified: last, etag: nil) 4 @data = DataPoint.all 5 end 6 end 7 8 def last 9 Time.new(2016, 02, 10, 11, 22) 10 end 11 end
na segunda • Sem view na segunda • 123x mais rápido! O QUE ISSO SIGNIFICA? 19 Started GET "/charts" for 127.0.0.1 at 2016-03-10 11:24:41 -0300 20 Processing by ChartsController#index as */* 21 DataPoint Load (18.6ms) SELECT "data_points".* FROM "data_points" 22 Rendered charts/index.json.jbuilder (234.3ms) 23 Completed 200 OK in 247ms (Views: 224.8ms | ActiveRecord: 19.1ms) 44 Started GET "/charts" for 127.0.0.1 at 2016-03-10 11:25:28 -0300 45 Processing by ChartsController#index as */* 46 Completed 304 Not Modified in 2ms (ActiveRecord: 0.0ms)
(3) • É menos custoso contar do que pegar os registros CONTROLLER 1 class ChartsController < ApplicationController 2 def index 3 if stale?(last: nil, etag: DataPoint.count) 4 @data = DataPoint.all 5 end 6 end 7 end
SELECT na segunda • Sem view na segunda • 46x mais rápido! O QUE ISSO SIGNIFICA? 79 Started GET "/charts" for 127.0.0.1 at 2016-03-10 11:36:28 -0300 80 Processing by ChartsController#index as */* 81 (0.2ms) SELECT COUNT(*) FROM "data_points" 83 DataPoint Load (17.5ms) SELECT "data_points".* FROM "data_points" 84 Rendered charts/index.json.jbuilder (289.8ms) 85 Completed 200 OK in 303ms (Views: 277.9ms | ActiveRecord: 17.7ms) 104 Started GET "/charts" for 127.0.0.1 at 2016-03-10 11:36:30 -0300 105 Processing by ChartsController#index as */* 106 (0.2ms) SELECT COUNT(*) FROM "data_points" 108 Completed 304 Not Modified in 6ms (ActiveRecord: 0.2ms)
Ótima ferramenta para apagar incêndios •Desvantagens • Pode não ser adequado • Causa picos de lentidão quando o cache expira • Usuário vai “sentir" o cache miss
quando o cache expira • Engloba os casos que o cache de tempo e o cache_key não cobre •Desvantagens • É preciso invalidar o cache para toda mudança de dado que influencie o mesmo • Na maioria das arquiteturas se torna uma tarefa bastante complexa • > Débito técnico :-(