Improved caching.

This commit is contained in:
Martin Edenhofer 2012-08-02 14:42:50 +02:00
parent f6fd9673de
commit f33afff5c8
2 changed files with 118 additions and 27 deletions

View file

@ -52,6 +52,7 @@ module Session
def self.jobs def self.jobs
state_client_ids = {} state_client_ids = {}
state_user_ids = {}
while true while true
client_ids = self.sessions client_ids = self.sessions
client_ids.each { |client_id| client_ids.each { |client_id|
@ -66,10 +67,23 @@ module Session
next if !user_session[:id] next if !user_session[:id]
user = User.find( user_session[:id] ) user = User.find( user_session[:id] )
if !state_user_ids[ user.id ]
state_user_ids[ user.id ] = {}
end
# check user cache
if self.jobs_user_needed( state_user_ids[ user.id ], :overview, 1.seconds )
puts "fetch for user_id #{ user.id } :overview..."
# overview meta data # overview meta data
overview = Ticket.overview( overview = Ticket.overview(
:current_user_id => user.id, :current_user_id => user.id,
) )
self.jobs_user_data_set( state_user_ids[ user.id ], :overview, overview )
else
puts "use user_id #{ user.id } cache for :overview..."
overview = self.jobs_user_data_get( state_user_ids[ user.id ], :overview )
end
if state_client_ids[client_id][:overview] != overview if state_client_ids[client_id][:overview] != overview
state_client_ids[client_id][:overview] = overview state_client_ids[client_id][:overview] = overview
@ -88,15 +102,25 @@ module Session
state_client_ids[client_id][:overview_data] = {} state_client_ids[client_id][:overview_data] = {}
end end
overviews.each { |overview| overviews.each { |overview|
# check user cache
cache_key = ( 'overview_data_' + overview.meta[:url] ).to_sym
if self.jobs_user_needed( state_user_ids[ user.id ], cache_key, 1.seconds )
puts "fetch for user_id #{ user.id } #{ cache_key.to_s }..."
overview_data = Ticket.overview( overview_data = Ticket.overview(
:view => overview.meta[:url], :view => overview.meta[:url],
# :view_mode => params[:view_mode], # :view_mode => params[:view_mode],
:current_user_id => user.id, :current_user_id => user.id,
:array => true, :array => true,
) )
self.jobs_user_data_set( state_user_ids[ user.id ], cache_key, overview_data )
else
puts "use user_id #{ user.id } cache for #{ cache_key.to_s }..."
overview_data = self.jobs_user_data_get( state_user_ids[ user.id ], cache_key )
end
if state_client_ids[client_id][:overview_data][ overview.meta[:url] ] != overview_data if state_client_ids[client_id][ cache_key ] != overview_data
state_client_ids[client_id][:overview_data][ overview.meta[:url] ] = overview_data state_client_ids[client_id][ cache_key ] = overview_data
puts 'push overview ' + overview.meta[:url].to_s puts 'push overview ' + overview.meta[:url].to_s
users = {} users = {}
tickets = [] tickets = []
@ -128,6 +152,7 @@ puts 'push overview ' + overview.meta[:url].to_s
user, user,
client_id, client_id,
state_client_ids[ client_id ], state_client_ids[ client_id ],
state_user_ids[ user.id ],
) )
# activity stream # activity stream
@ -135,6 +160,7 @@ puts 'push overview ' + overview.meta[:url].to_s
user, user,
client_id, client_id,
state_client_ids[client_id], state_client_ids[client_id],
state_user_ids[ user.id ],
) )
# ticket create # ticket create
@ -142,6 +168,7 @@ puts 'push overview ' + overview.meta[:url].to_s
user, user,
client_id, client_id,
state_client_ids[client_id], state_client_ids[client_id],
state_user_ids[ user.id ],
) )
# system settings # system settings
@ -230,7 +257,7 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
end end
def self.jobs_recent_viewed(user, client_id, client_state) def self.jobs_recent_viewed(user, client_id, client_state, state_user )
# name space # name space
if !client_state[:recent_viewed] if !client_state[:recent_viewed]
@ -238,13 +265,24 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
# only fetch every x seconds # only fetch every x seconds
return if client_state[:recent_viewed][:last_run] && Time.new - client_state[:recent_viewed][:last_run] < 10.seconds return if client_state[:recent_viewed][:last_run] && Time.new - client_state[:recent_viewed][:last_run] < 4.seconds
# remember last run # remember last run
client_state[:recent_viewed][:last_run] = Time.new client_state[:recent_viewed][:last_run] = Time.new
puts 'check :recent_viewed' puts 'check :recent_viewed'
# fetch data
if self.jobs_user_needed( state_user, :recent_viewed, 10.seconds )
puts "fetch for user_id #{ user.id } :recent_viewed..."
recent_viewed = History.recent_viewed(user) recent_viewed = History.recent_viewed(user)
self.jobs_user_data_set( state_user, :recent_viewed, recent_viewed )
else
puts "use user_id #{ user.id } cache for :recent_viewed..."
recent_viewed = self.jobs_user_data_get( state_user, :recent_viewed )
end
if client_state[:recent_viewed][:data] != recent_viewed if client_state[:recent_viewed][:data] != recent_viewed
client_state[:recent_viewed][:data] = recent_viewed client_state[:recent_viewed][:data] = recent_viewed
@ -259,7 +297,7 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
end end
def self.jobs_activity_stream(user, client_id, client_state) def self.jobs_activity_stream(user, client_id, client_state, state_user)
# name space # name space
if !client_state[:activity_stream] if !client_state[:activity_stream]
@ -267,14 +305,23 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
# only fetch every x seconds # only fetch every x seconds
return if client_state[:activity_stream][:last_run] && Time.new - client_state[:activity_stream][:last_run] < 20.seconds return if client_state[:activity_stream][:last_run] && Time.new - client_state[:activity_stream][:last_run] < 8.seconds
# remember last run # remember last run
client_state[:activity_stream][:last_run] = Time.new client_state[:activity_stream][:last_run] = Time.new
puts 'check :activity_stream' puts 'check :activity_stream'
if self.jobs_user_needed( state_user, :activity_stream, 3.seconds )
puts "fetch for user_id #{ user.id } :activity_stream..."
activity_stream = History.activity_stream(user) activity_stream = History.activity_stream(user)
self.jobs_user_data_set( state_user, :activity_stream, activity_stream )
else
puts "use user_id #{ user.id } cache for :activity_stream..."
activity_stream = self.jobs_user_data_get( state_user, :activity_stream )
end
if client_state[:activity_stream][:data] != activity_stream if client_state[:activity_stream][:data] != activity_stream
client_state[:activity_stream][:data] = activity_stream client_state[:activity_stream][:data] = activity_stream
@ -289,7 +336,7 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
end end
def self.jobs_create_attributes(user, client_id, client_state) def self.jobs_create_attributes(user, client_id, client_state, state_user)
# name space # name space
if !client_state[:create_attributes] if !client_state[:create_attributes]
@ -297,15 +344,23 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
# only fetch every x seconds # only fetch every x seconds
return if client_state[:create_attributes][:last_run] && Time.new - client_state[:create_attributes][:last_run] < 15.seconds return if client_state[:create_attributes][:last_run] && Time.new - client_state[:create_attributes][:last_run] < 12.seconds
# remember last run # remember last run
client_state[:create_attributes][:last_run] = Time.new client_state[:create_attributes][:last_run] = Time.new
puts 'check :create_attributes' puts 'check :create_attributes'
if self.jobs_user_needed( state_user, :create_attributes, 26.seconds )
puts "fetch for user_id #{ user.id } :create_attributes..."
ticket_create_attributes = Ticket.create_attributes( ticket_create_attributes = Ticket.create_attributes(
:current_user_id => user.id, :current_user_id => user.id,
) )
self.jobs_user_data_set( state_user, :create_attributes, ticket_create_attributes )
else
puts "use user_id #{ user.id } cache for :create_attributes..."
ticket_create_attributes = self.jobs_user_data_get( state_user, :create_attributes )
end
if client_state[:create_attributes][:data] != ticket_create_attributes if client_state[:create_attributes][:data] != ticket_create_attributes
client_state[:create_attributes][:data] = ticket_create_attributes client_state[:create_attributes][:data] = ticket_create_attributes
@ -318,6 +373,42 @@ puts 'push overview ' + overview.meta[:url].to_s
end end
end end
def self.jobs_user_needed( item, key, ttl )
if !item[key]
item[key] = {}
end
# run needed on initial
if !item[:last_run]
# set new last run
item[:last_run] = Time.new
return true
end
# run needed if ttl is over
if Time.new - item[:last_run] > ttl
# set new last run
item[:last_run] = Time.new
return true
end
# no new run needed
return false
end
def self.jobs_user_data_get( item, key )
return item[key][:data]
end
def self.jobs_user_data_set( item, key, data )
item[key][:data] = data
return true
end
def self.sessions def self.sessions
path = @path + '/' path = @path + '/'
data = [] data = []

View file

@ -82,9 +82,9 @@ EventMachine.run {
end end
EventMachine.add_periodic_timer(0.4) { EventMachine.add_periodic_timer(0.4) {
# puts "loop" puts "loop"
@clients.each { |client_id, client| @clients.each { |client_id, client|
# puts 'checking client...' + client_id.to_s puts 'checking client...' + client_id.to_s
begin begin
queue = Session.queue( client_id ) queue = Session.queue( client_id )
if queue && queue[0] if queue && queue[0]