Class: Async::HTTP::Cache::Store::Memory

Inherits:
Object
  • Object
show all
Defined in:
lib/async/http/cache/store/memory.rb

Constant Summary collapse

IF_NONE_MATCH =
'if-none-match'
NOT_MODIFIED =
::Protocol::HTTP::Response[304]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(limit: 1024) ⇒ Memory

Returns a new instance of Memory.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/async/http/cache/store/memory.rb', line 28

def initialize(limit: 1024)
  @index = {}
  @limit = limit
  
  @hit = 0
  @miss = 0
  @pruned = 0
  
  @gardener = Async do |task|
    while true
      task.sleep(60)
      
      pruned = self.prune
      @pruned += pruned
      
      Async.logger.debug(self) do |buffer|
        if pruned > 0
          buffer.puts "Pruned #{pruned} entries."
        end
        
        buffer.puts "Hits: #{@hit} Misses: #{@miss} Pruned: #{@pruned} Ratio: #{(100.0*@hit/@miss).round(2)}%"
        
        body_usage = @index.sum{|key, value| value.body.length}
        buffer.puts "Index size: #{@index.size} Memory usage: #{(body_usage / 1024.0**2).round(2)}MiB"
        
        # @index.each do |key, value|
        #   buffer.puts "#{key.join('-')}: #{value.body.length}B"
        # end
      end
    end
  end
end

Instance Attribute Details

#indexObject (readonly)

Returns the value of attribute index.



65
66
67
# File 'lib/async/http/cache/store/memory.rb', line 65

def index
  @index
end

Instance Method Details

#closeObject



61
62
63
# File 'lib/async/http/cache/store/memory.rb', line 61

def close
  @gardener.stop
end

#insert(key, request, response) ⇒ Object



96
97
98
99
100
101
102
103
# File 'lib/async/http/cache/store/memory.rb', line 96

def insert(key, request, response)
  if @index.size < @limit
    length = response.body&.length
    if length.nil? or length < 1024*64
      @index[key] = response
    end
  end
end

#lookup(key, request) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/async/http/cache/store/memory.rb', line 70

def lookup(key, request)
  if response = @index[key]
    if response.expired?
      @index.delete(key)
      
      @pruned += 1
      
      return nil
    end
    
    if etags = request.headers[IF_NONE_MATCH]
      if etags.include?(response.etag)
        return NOT_MODIFIED
      end
    end
    
    @hit += 1
    
    return response.dup
  else
    @miss += 1
    
    return nil
  end
end

#pruneInteger

Returns the number of pruned entries.

Returns:

  • (Integer)

    the number of pruned entries.



106
107
108
109
110
111
112
113
114
# File 'lib/async/http/cache/store/memory.rb', line 106

def prune
  initial_count = @index.size
  
  @index.delete_if do |key, value|
    value.expired?
  end
  
  return initial_count - @index.size
end