level2 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +26 -5
- data/level2.gemspec +1 -1
- data/lib/active_support/cache/level2.rb +22 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89ba62e1f21baef8ee3a80060af7097b77ac6d98
|
4
|
+
data.tar.gz: 24b666e5ceeaacf63769b2928483afc83567e79e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e9274d7574970ff0542c3ec84cb524680f08feb1c1da7fb404faa0897e8b1c5b2b3e144ddccd0a9317a75bcccdb111ed5274f4cde00f8b3da2a0fdd274bbaa9
|
7
|
+
data.tar.gz: 4753d3f1e2a4b77e4b8a9523aaf87627393b0289c245570e39981a432ee424853f28bf4b5cb9a07286159e9e0da328eececc85ae83cbc8843638d38eb55f261f
|
data/README.md
CHANGED
@@ -50,14 +50,35 @@ Example:
|
|
50
50
|
```ruby
|
51
51
|
# in config/application.rb
|
52
52
|
|
53
|
-
config.cache_store = :level2,
|
54
|
-
:
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
config.cache_store = :level2,
|
54
|
+
L1: [
|
55
|
+
:memory_store, size: 32.megabytes
|
56
|
+
],
|
57
|
+
L2: [
|
58
|
+
:mem_cache_store, 'host1.example.org:11211'
|
59
|
+
]
|
58
60
|
```
|
59
61
|
|
62
|
+
## Notifications
|
60
63
|
|
64
|
+
Level2 enriches
|
65
|
+
[`ActiveSupport::Notifications`](http://edgeguides.rubyonrails.org/active_support_instrumentation.html#active-support).
|
66
|
+
|
67
|
+
Event payloads will include a `:level` field. On cache hits, this will indicate
|
68
|
+
where the hit comes from; on misses, or any other event, the field may be
|
69
|
+
present but the value is unspecified.
|
70
|
+
|
71
|
+
Example:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# in an initializer
|
75
|
+
ActiveSupport::Notifications.subscribe 'cache_read.active_support' do |*args|
|
76
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
77
|
+
if event.payload[:hit]
|
78
|
+
Rails.logger.info "Hit from #{event.payload[:level]}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
```
|
61
82
|
|
62
83
|
## Development
|
63
84
|
|
data/level2.gemspec
CHANGED
@@ -5,10 +5,10 @@ module ActiveSupport
|
|
5
5
|
class Level2 < Store
|
6
6
|
attr_reader :stores
|
7
7
|
|
8
|
-
def initialize(
|
8
|
+
def initialize(store_options)
|
9
9
|
@lock = Mutex.new
|
10
|
-
@stores = store_options.
|
11
|
-
ActiveSupport::Cache.lookup_store(
|
10
|
+
@stores = store_options.each_with_object({}) do |(name,options), h|
|
11
|
+
h[name] = ActiveSupport::Cache.lookup_store(options)
|
12
12
|
end
|
13
13
|
@options = {}
|
14
14
|
end
|
@@ -27,6 +27,13 @@ module ActiveSupport
|
|
27
27
|
|
28
28
|
protected
|
29
29
|
|
30
|
+
def instrument(operation, key, options = nil, &block)
|
31
|
+
super(operation, key, options) do |payload|
|
32
|
+
payload[:level] = current_level
|
33
|
+
block.call(payload)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
30
37
|
def read_entry(key, options)
|
31
38
|
@lock.synchronize do
|
32
39
|
read_entry_from(@stores, key, options)
|
@@ -35,7 +42,7 @@ module ActiveSupport
|
|
35
42
|
|
36
43
|
def write_entry(key, entry, options)
|
37
44
|
@lock.synchronize do
|
38
|
-
@stores.each do |store|
|
45
|
+
@stores.each do |name, store|
|
39
46
|
result = store.send :write_entry, key, entry, options
|
40
47
|
return false unless result
|
41
48
|
end
|
@@ -45,7 +52,7 @@ module ActiveSupport
|
|
45
52
|
|
46
53
|
def delete_entry(key, options)
|
47
54
|
@lock.synchronize do
|
48
|
-
@stores.map { |store|
|
55
|
+
@stores.map { |name,store|
|
49
56
|
store.send :delete_entry, key, options
|
50
57
|
}.all?
|
51
58
|
end
|
@@ -53,10 +60,19 @@ module ActiveSupport
|
|
53
60
|
|
54
61
|
private
|
55
62
|
|
63
|
+
def current_level
|
64
|
+
Thread.current[:level2_current]
|
65
|
+
end
|
66
|
+
|
67
|
+
def current_level!(name)
|
68
|
+
Thread.current[:level2_current] = name
|
69
|
+
end
|
70
|
+
|
56
71
|
def read_entry_from(stores, key, options)
|
57
72
|
return if stores.empty?
|
58
73
|
|
59
|
-
store, *other_stores = stores
|
74
|
+
(name,store), *other_stores = stores.to_a
|
75
|
+
current_level! name
|
60
76
|
entry = store.send :read_entry, key, options
|
61
77
|
return entry if entry.present?
|
62
78
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: level2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Letessier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|