Merge pull request #3593 from tgxworld/cache_results_on_about_page

Cache results on about page
This commit is contained in:
Sam
2015-07-21 10:04:51 +10:00
12 changed files with 121 additions and 19 deletions

View File

@@ -0,0 +1,13 @@
module Jobs
class AboutStats < Jobs::Scheduled
include Jobs::Stats
every 30.minutes
def execute(args)
stats = About.new.stats
set_cache(About, stats)
stats
end
end
end

View File

@@ -1,16 +1,13 @@
module Jobs
class DashboardStats < Jobs::Scheduled
include Jobs::Stats
every 30.minutes
def execute(args)
stats = AdminDashboardData.fetch_stats.as_json
# Add some extra time to the expiry so that the next job run has plenty of time to
# finish before previous cached value expires.
$redis.setex AdminDashboardData.stats_cache_key, (AdminDashboardData.recalculate_interval + 5).minutes, stats.to_json
stats = AdminDashboardData.new.as_json
set_cache(AdminDashboardData, stats)
stats
end
end
end

9
app/jobs/stats.rb Normal file
View File

@@ -0,0 +1,9 @@
module Jobs
module Stats
def set_cache(klass, stats)
# Add some extra time to the expiry so that the next job run has plenty of time to
# finish before previous cached value expires.
$redis.setex klass.stats_cache_key, (klass.recalculate_stats_interval + 5).minutes, stats.to_json
end
end
end

View File

@@ -1,9 +1,18 @@
class About
include ActiveModel::Serialization
include StatsCacheable
attr_accessor :moderators,
:admins
def self.stats_cache_key
'about-stats'
end
def self.fetch_stats
About.new.stats
end
def version
Discourse::VERSION::STRING
end

View File

@@ -1,6 +1,7 @@
require_dependency 'mem_info'
class AdminDashboardData
include StatsCacheable
GLOBAL_REPORTS ||= [
'visits',
@@ -57,13 +58,7 @@ class AdminDashboardData
def self.fetch_stats
AdminDashboardData.new
end
def self.fetch_cached_stats
# The DashboardStats job is responsible for generating and caching this.
stats = $redis.get(stats_cache_key)
stats ? JSON.parse(stats) : nil
AdminDashboardData.new.as_json
end
def self.stats_cache_key
@@ -97,11 +92,6 @@ class AdminDashboardData
source.map { |type| Report.find(type).as_json }
end
# Could be configurable, multisite need to support it.
def self.recalculate_interval
30 # minutes
end
def rails_env_check
I18n.t("dashboard.rails_env_warning", env: Rails.env) unless Rails.env.production?
end

View File

@@ -0,0 +1,24 @@
module StatsCacheable
extend ActiveSupport::Concern
module ClassMethods
def stats_cache_key
raise 'Stats cache key has not been set.'
end
def fetch_stats
raise 'Not implemented.'
end
# Could be configurable, multisite need to support it.
def recalculate_stats_interval
30 # minutes
end
def fetch_cached_stats
# The scheduled Stats job is responsible for generating and caching this.
stats = $redis.get(stats_cache_key)
stats ? JSON.parse(stats) : nil
end
end
end

View File

@@ -8,4 +8,8 @@ class AboutSerializer < ApplicationSerializer
:locale,
:version,
:https
def stats
object.class.fetch_cached_stats || Jobs::AboutStats.new.execute({})
end
end