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, maximum_size: 1024*64, prune_interval: 60) ⇒ Memory

Returns a new instance of Memory.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/async/http/cache/store/memory.rb', line 11

def initialize(limit: 1024, maximum_size: 1024*64, prune_interval: 60)
	@index = {}
	@limit = limit
	@maximum_size = maximum_size
	
	@hit = 0
	@miss = 0
	@pruned = 0
	
	@gardener = Async(transient: true, annotation: self.class) do |task|
		while true
			task.sleep(prune_interval)
			
			pruned = self.prune
			@pruned += pruned
			
			Console.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.



49
50
51
# File 'lib/async/http/cache/store/memory.rb', line 49

def index
  @index
end

Instance Method Details

#closeObject



45
46
47
# File 'lib/async/http/cache/store/memory.rb', line 45

def close
	@gardener.stop
end

#insert(key, request, response) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/async/http/cache/store/memory.rb', line 80

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

#lookup(key, request) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/async/http/cache/store/memory.rb', line 54

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.



90
91
92
93
94
95
96
97
98
# File 'lib/async/http/cache/store/memory.rb', line 90

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