Class: Moneta::Adapters::LRUHash

Inherits:
Base
  • Object
show all
Includes:
Mixins::IncrementSupport
Defined in:
lib/moneta/adapters/lruhash.rb

Overview

LRUHash backend

Based on Hashery::LRUHash but simpler and measures memory usage instead of hash size.

Defined Under Namespace

Classes: Entry

Instance Method Summary collapse

Methods included from Mixins::IncrementSupport

#increment

Methods inherited from Base

#[], #[]=, #close, #decrement, #fetch, #increment

Methods included from Mixins::WithOptions

#expires, #prefix, #raw, #with

Constructor Details

#initialize(options = {}) ⇒ LRUHash

Constructor

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :max_size (Integer) — default: 1024000

    Maximum total byte size of hash values



15
16
17
18
# File 'lib/moneta/adapters/lruhash.rb', line 15

def initialize(options = {})
  @max_size = options[:max_size] || 1024000
  clear
end

Instance Method Details

#clear(options = {}) ⇒ Object



53
54
55
56
57
58
# File 'lib/moneta/adapters/lruhash.rb', line 53

def clear(options = {})
  @entry, @size = {}, 0
  @list = Entry.new
  @list.prev = @list.next = @list
  self
end

#delete(key, options = {}) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/moneta/adapters/lruhash.rb', line 45

def delete(key, options = {})
  if entry = @entry.delete(key)
    @size -= entry.value.bytesize
    entry.unlink
    entry.value
  end
end

#key?(key, options = {}) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/moneta/adapters/lruhash.rb', line 20

def key?(key, options = {})
  @entry.key?(key)
end

#load(key, options = {}) ⇒ Object



24
25
26
27
28
29
# File 'lib/moneta/adapters/lruhash.rb', line 24

def load(key, options = {})
  if entry = @entry[key]
    entry.insert_after(@list)
    entry.value
  end
end

#store(key, value, options = {}) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/moneta/adapters/lruhash.rb', line 31

def store(key, value, options = {})
  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
  value
end