LRUHash backend
Based on Hashery::LRUHash but simpler and measures both memory usage and hash size.
@api public
@param [Hash] options @option options [Integer] :max_size (1024000) Maximum byte size of all values @option options [Integer] :max_value (options) Maximum byte size of one value @option options [Integer] :max_count (10240) Maximum number of values
# File lib/moneta/adapters/lruhash.rb, line 17 def initialize(options = {}) @max_size = options[:max_size] || 1024000 @max_count = options[:max_count] || 10240 @max_value = options[:max_value] || @max_size clear end
(see Moneta::Proxy#clear)
# File lib/moneta/adapters/lruhash.rb, line 66 def clear(options = {}) @entry, @size = {}, 0 @list = Entry.new @list.prev = @list.next = @list self end
(see Moneta::Proxy#delete)
# File lib/moneta/adapters/lruhash.rb, line 57 def delete(key, options = {}) if entry = @entry.delete(key) @size -= entry.value.bytesize entry.unlink entry.value end end
(see Moneta::Proxy#key?)
# File lib/moneta/adapters/lruhash.rb, line 25 def key?(key, options = {}) @entry.key?(key) end
(see Moneta::Proxy#load)
# File lib/moneta/adapters/lruhash.rb, line 30 def load(key, options = {}) if entry = @entry[key] entry.insert_after(@list) entry.value end end
(see Moneta::Proxy#store)
# File lib/moneta/adapters/lruhash.rb, line 38 def store(key, value, options = {}) if value.bytesize > @max_value delete(key) else if entry = @entry[key] @size -= entry.value.bytesize else @entry[key] = entry = Entry.new entry.key = key end entry.value = value @size += entry.value.bytesize entry.insert_after(@list) delete(@list.prev.key) while @list.next != @list.prev && (@size > @max_size || @entry.size > @max_count) end value end