56 lines
1.4 KiB
Ruby
56 lines
1.4 KiB
Ruby
module Carto
|
|
class UserDbSizeCache
|
|
|
|
DB_SIZE_IN_BYTES_EXPIRATION = 2.days
|
|
|
|
UPDATE_PROPAGATION_THRESHOLD = 8.hours
|
|
|
|
BATCH_SIZE = 100
|
|
|
|
def initialize(redis_cache = $users_metadata)
|
|
@redis = redis_cache
|
|
end
|
|
|
|
def update_if_old(user)
|
|
if last_updated(user) > UPDATE_PROPAGATION_THRESHOLD
|
|
set_db_size_in_bytes(user)
|
|
end
|
|
end
|
|
|
|
def db_size_in_bytes(user)
|
|
@redis.get(db_size_in_bytes_key(user.username)).to_i
|
|
end
|
|
|
|
def db_size_in_bytes_change_users
|
|
keys = @redis.scan_each(match: db_size_in_bytes_key('*')).to_a.uniq
|
|
|
|
db_size_in_bytes_change_users = {}
|
|
|
|
keys.each_slice(BATCH_SIZE) do |key_batch|
|
|
usernames = key_batch.map { |key| extract_username_from_key(key) }
|
|
db_size_in_bytes_change_users.merge!(Hash[usernames.zip(@redis.mget(key_batch).map(&:to_i))])
|
|
end
|
|
|
|
db_size_in_bytes_change_users
|
|
end
|
|
|
|
private
|
|
|
|
def last_updated(user)
|
|
DB_SIZE_IN_BYTES_EXPIRATION - @redis.ttl(db_size_in_bytes_key(user.username))
|
|
end
|
|
|
|
def set_db_size_in_bytes(user)
|
|
@redis.setex(db_size_in_bytes_key(user.username), DB_SIZE_IN_BYTES_EXPIRATION.to_i, user.db_size_in_bytes)
|
|
end
|
|
|
|
def db_size_in_bytes_key(username)
|
|
"rails:users:#{username}:db_size_in_bytes"
|
|
end
|
|
|
|
def extract_username_from_key(key)
|
|
/#{db_size_in_bytes_key('(.*)')}/.match(key)[1]
|
|
end
|
|
end
|
|
end
|