Make entry generic

This commit is contained in:
Leeingnyo 2021-09-04 14:37:29 +09:00
parent 9e90aa17b9
commit 5e919d3e19
2 changed files with 50 additions and 14 deletions

View File

@ -1,5 +1,7 @@
require "digest"
require "./entry"
class InfoCache
alias ProgressCache = Tuple(String, Int32)
@ -158,23 +160,46 @@ class InfoCache
end
end
private class SortedEntriesCacheEntry
@value : Array(String)
private class CacheEntry(SaveT, ReturnT)
getter key : String, atime : Time
def initialize(@ctime : Time, @key : String, value : Array(Entry))
@atime = @ctime
@value = value.map &.id
@value : SaveT
def initialize(@key : String, value : ReturnT)
@atime = @ctime = Time.utc
@value = self.class.to_save_t value
end
def value
@atime = Time.utc
SortedEntriesCacheEntry.ids2entries @value
self.class.to_return_t @value
end
# private?
def self.ids2entries(ids : Array(String))
def self.to_save_t(value : ReturnT)
value
end
def self.to_return_t(value : SaveT)
value
end
def instance_size
instance_sizeof(CacheEntry(SaveT, ReturnT)) + # sizeof itself
instance_sizeof(String) + @key.bytesize + # allocated memory for @key
@value.instance_size
end
end
class SortedEntriesCacheEntry < CacheEntry(Array(String), Array(Entry))
def self.to_save_t(value : Array(Entry))
value.map &.id
end
def self.to_return_t(value : Array(String))
ids2entries value
end
private def self.ids2entries(ids : Array(String))
e_map = Library.default.deep_entries.to_h { |entry| {entry.id, entry} }
entries = [] of Entry
begin
@ -202,11 +227,21 @@ private class SortedEntriesCacheEntry
end
end
alias CacheEntryType = SortedEntriesCacheEntry
def generate_cache_entry(key : String, value : Array(Entry) | Int32 | String)
if value.is_a? Array(Entry)
SortedEntriesCacheEntry.new key, value
else
CacheEntry(typeof(value), typeof(value)).new key, value
end
end
# LRU Cache
class SortedEntriesCache
@@limit : Int128 = Int128.new 0
# key => entry
@@cache = {} of String => SortedEntriesCacheEntry
@@cache = {} of String => CacheEntryType
def self.init
enabled = Config.current.sorted_entries_cache_enable
@ -221,8 +256,9 @@ class SortedEntriesCache
return entry.value unless entry.nil?
end
def self.set(key : String, value : Array(Entry))
@@cache[key] = SortedEntriesCacheEntry.new Time.utc, key, value
def self.set(cache_entry : CacheEntryType)
key = cache_entry.key
@@cache[key] = cache_entry
Logger.debug "LRUCache Cached #{key}"
remove_victim_cache
end

View File

@ -346,7 +346,7 @@ class Title
def sorted_entries(username, opt : SortOptions? = nil)
cache_key = SortedEntriesCacheEntry.gen_key @id, username, @entries, opt
cached_entries = SortedEntriesCache.get cache_key
return cached_entries if cached_entries
return cached_entries if cached_entries.is_a? Array(Entry)
if opt.nil?
opt = SortOptions.from_info_json @dir, username
@ -382,7 +382,7 @@ class Title
ary.reverse! unless opt.not_nil!.ascend
if Config.current.sorted_entries_cache_enable
SortedEntriesCache.set cache_key, ary
SortedEntriesCache.set generate_cache_entry cache_key, ary
end
ary
end