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.



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
60
# File 'lib/async/http/cache/store/memory.rb', line 28

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.



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

def index
  @index
end

Instance Method Details

#closeObject



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

def close
	@gardener.stop
end

#insert(key, request, response) ⇒ Object



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

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



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

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.



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

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