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(transient: true, annotation: self.class) do |task|
		while true
			task.sleep(60)
			
			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.



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