Ruby on rails Rails 5缓存不是';t在当地或生产中工作
我正试图从这个外部数据源获取数据,并在本地和生产环境中显示在我的应用程序中,由于每次请求数据刷新都会占用大量资源,因此我希望将其缓存一段相对较长的时间,可能是15分钟、1小时等。我编写了这段代码,但它根本没有显示任何类型的缓存 新冠病毒控制器.rbRuby on rails Rails 5缓存不是';t在当地或生产中工作,ruby-on-rails,api,caching,Ruby On Rails,Api,Caching,我正试图从这个外部数据源获取数据,并在本地和生产环境中显示在我的应用程序中,由于每次请求数据刷新都会占用大量资源,因此我希望将其缓存一段相对较长的时间,可能是15分钟、1小时等。我编写了这段代码,但它根本没有显示任何类型的缓存 新冠病毒控制器.rb require "net/http" class Covid19::CovidController < ApplicationController def index @covid_news_posts = CovidNewsPos
require "net/http"
class Covid19::CovidController < ApplicationController
def index
@covid_news_posts = CovidNewsPost.published.limit(10).order("created_at DESC").includes([:user])
cache_key_with_version = CovidNewsPost.last
@cache = Rails.cache.fetch("#{cache_key_with_version}", expires_in: 15.minutes) do
covid_api_url = "https://bing.com/covid/data"
resp = Net::HTTP.get_response(URI.parse(covid_api_url))
covidapi = JSON.parse(resp.body)
end
end
end
development.rb
# Enable/disable caching. By default caching is disabled.
if Rails.root.join('tmp/caching-dev.txt').exist?
config.action_controller.perform_caching = true
config.cache_store = :memory_store
config.public_file_server.headers = {
'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
不确定在这里要做什么,只想加载请求服务器端一次,然后在需要多长时间的情况下缓存它
这里有一个来自生产部门的请求,没有显示任何缓存
I, [2020-04-13T20:46:40.057029 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Started GET "/covid19" for 71.113.156.118 at 2020-04-13 20:46:40 +0000
I, [2020-04-13T20:46:40.060499 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Processing by Covid19::CovidController#index as HTML
D, [2020-04-13T20:46:40.063881 #2088] DEBUG -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
D, [2020-04-13T20:46:40.065930 #2088] DEBUG -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] CovidNewsPost Load (0.6ms) SELECT "covid_news_posts".* FROM "covid_news_posts" ORDER BY "covid_news_posts"."id" DESC LIMIT $1 [["LIMIT", 1]]
I, [2020-04-13T20:46:40.458451 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendering layouts/application.html.erb
I, [2020-04-13T20:46:40.458928 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendering covid19/covid/index.html.erb within layouts/application
I, [2020-04-13T20:46:40.460280 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendered covid19/_covid19_menu.html.erb (0.3ms)
D, [2020-04-13T20:46:40.462798 #2088] DEBUG -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] CovidNewsPost Load (1.7ms) SELECT "covid_news_posts".* FROM "covid_news_posts" WHERE "covid_news_posts"."published" = $1 ORDER BY created_at DESC LIMIT $2 [["published", true], ["LIMIT", 10]]
D, [2020-04-13T20:46:40.465690 #2088] DEBUG -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" IN ($1, $2, $3, $4, $5, $6) [["id", 251], ["id", 3], ["id", 860], ["id", 208], ["id", 1985], ["id", 2794]]
I, [2020-04-13T20:46:40.476577 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendered static/global/_footer.html.erb (1.6ms)
I, [2020-04-13T20:46:40.476792 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendered covid19/covid/index.html.erb within layouts/application (17.8ms)
I, [2020-04-13T20:46:40.477422 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendered application/_favicon.html.erb (0.4ms)
I, [2020-04-13T20:46:40.478655 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Rendered layouts/application.html.erb (20.1ms)
I, [2020-04-13T20:46:40.479248 #2088] INFO -- : [aee0a42a-0d29-432d-af0e-0f21bb5253d9] Completed 200 OK in 419ms (Views: 18.4ms | ActiveRecord: 3.9ms)
版本为的
cache\u key\u被分配给CovidNewsPost.last
,它可能是一个ActiveRecord实例。然后将其转换为字符串并用作缓存键。此字符串中的任何变化都将导致获取和填充新的缓存项,并且记录的字符串表示形式不一定以任何特定方式保证一致
您可能希望使用更具体的字符串,如“#{cache\u key\u with_version.id}-#{cache\u key\u with_version.version}”
,以确保只有您想要成为缓存键一部分的字段实际上是缓存键的一部分
除此之外,您还可以使用Rails控制台验证缓存配置是否正确:
2.times.map { Rails.cache.fetch("test", expires_in: 1) { rand } }.uniq.length == 1
如果缓存配置正确且工作正常,您将看到true
。如果没有,您将得到false
2.times.map { Rails.cache.fetch("test", expires_in: 1) { rand } }.uniq.length == 1