second_level_cache 1.3.2 → 1.5.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.
- data/CHANGELOG.md +11 -0
- data/lib/second_level_cache.rb +10 -2
- data/lib/second_level_cache/active_record.rb +4 -0
- data/lib/second_level_cache/active_record/base.rb +1 -1
- data/lib/second_level_cache/active_record/belongs_to_association.rb +5 -2
- data/lib/second_level_cache/active_record/fetch_by_uniq_key.rb +25 -0
- data/lib/second_level_cache/active_record/has_one_association.rb +28 -0
- data/lib/second_level_cache/version.rb +1 -1
- data/test/active_record/base_test.rb +6 -11
- data/test/active_record/belongs_to_association_test.rb +2 -0
- data/test/active_record/finder_methods_test.rb +2 -0
- data/test/active_record/model/user.rb +2 -1
- data/test/active_record/polymorphic_association_test.rb +2 -0
- data/test/active_record/second_level_cache_test.rb +2 -3
- metadata +10 -2
data/CHANGELOG.md
CHANGED
@@ -17,3 +17,14 @@
|
|
17
17
|
1.3.2
|
18
18
|
-----
|
19
19
|
* [fix has one assciation issue]
|
20
|
+
|
21
|
+
1.4.0
|
22
|
+
-----
|
23
|
+
* [cache has one assciation]
|
24
|
+
|
25
|
+
1.4.1
|
26
|
+
-----
|
27
|
+
* [fix errors when belongs_to association return nil]
|
28
|
+
|
29
|
+
1.5.0
|
30
|
+
* [add cache version to quick clear cache for special model]
|
data/lib/second_level_cache.rb
CHANGED
@@ -22,6 +22,7 @@ module SecondLevelCache
|
|
22
22
|
@second_level_cache_enabled = true
|
23
23
|
@second_level_cache_options = options
|
24
24
|
@second_level_cache_options[:expires_in] ||= 1.day
|
25
|
+
@second_level_cache_options[:version] ||= 0
|
25
26
|
end
|
26
27
|
|
27
28
|
def second_level_cache_enabled?
|
@@ -40,8 +41,12 @@ module SecondLevelCache
|
|
40
41
|
Config.cache_key_prefix
|
41
42
|
end
|
42
43
|
|
44
|
+
def cache_version
|
45
|
+
second_level_cache_options[:version]
|
46
|
+
end
|
47
|
+
|
43
48
|
def second_level_cache_key(id)
|
44
|
-
"#{cache_key_prefix}/#{name.downcase}/#{id}"
|
49
|
+
"#{cache_key_prefix}/#{name.downcase}/#{id}/#{cache_version}"
|
45
50
|
end
|
46
51
|
|
47
52
|
def read_second_level_cache(id)
|
@@ -62,7 +67,10 @@ module SecondLevelCache
|
|
62
67
|
end
|
63
68
|
|
64
69
|
def write_second_level_cache
|
65
|
-
|
70
|
+
if self.class.second_level_cache_enabled?
|
71
|
+
self.clear_association_cache
|
72
|
+
SecondLevelCache.cache_store.write(second_level_cache_key, self, :expires_in => self.class.second_level_cache_options[:expires_in])
|
73
|
+
end
|
66
74
|
end
|
67
75
|
end
|
68
76
|
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'second_level_cache/active_record/base'
|
3
|
+
require 'second_level_cache/active_record/fetch_by_uniq_key'
|
3
4
|
require 'second_level_cache/active_record/finder_methods'
|
4
5
|
require 'second_level_cache/active_record/persistence'
|
5
6
|
require 'second_level_cache/active_record/belongs_to_association'
|
7
|
+
require 'second_level_cache/active_record/has_one_association'
|
6
8
|
|
7
9
|
ActiveRecord::Base.send(:include, SecondLevelCache::Mixin)
|
8
10
|
ActiveRecord::Base.send(:include, SecondLevelCache::ActiveRecord::Base)
|
11
|
+
ActiveRecord::Base.send(:extend, SecondLevelCache::ActiveRecord::FetchByUniqKey)
|
9
12
|
ActiveRecord::FinderMethods.send(:include, SecondLevelCache::ActiveRecord::FinderMethods)
|
10
13
|
ActiveRecord::Base.send(:include, SecondLevelCache::ActiveRecord::Persistence)
|
11
14
|
ActiveRecord::Associations::BelongsToAssociation.send(:include, SecondLevelCache::ActiveRecord::Associations::BelongsToAssociation)
|
15
|
+
ActiveRecord::Associations::HasOneAssociation.send(:include, SecondLevelCache::ActiveRecord::Associations::HasOneAssociation)
|
@@ -15,8 +15,11 @@ module SecondLevelCache
|
|
15
15
|
cache_record = klass.read_second_level_cache(second_level_cache_key)
|
16
16
|
return cache_record.tap{|record| set_inverse_instance(record)} if cache_record
|
17
17
|
record = find_target_without_second_level_cache
|
18
|
-
|
19
|
-
record
|
18
|
+
|
19
|
+
record.tap do |r|
|
20
|
+
set_inverse_instance(r)
|
21
|
+
r.write_second_level_cache
|
22
|
+
end if record
|
20
23
|
end
|
21
24
|
|
22
25
|
private
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module SecondLevelCache
|
3
|
+
module ActiveRecord
|
4
|
+
module FetchByUniqKey
|
5
|
+
def fetch_by_uniq_key(value, uniq_key_name)
|
6
|
+
if iid = SecondLevelCache.cache_store.read(cache_uniq_key(value, uniq_key_name))
|
7
|
+
self.find_by_id(iid)
|
8
|
+
else
|
9
|
+
record = self.where(uniq_key_name => value).first
|
10
|
+
record.tap{|record| SecondLevelCache.cache_store.write(cache_uniq_key(value, uniq_key_name), record.id)} if record
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def fetch_by_uniq_key!(value, uniq_key_name)
|
15
|
+
fetch_by_uniq_key(value, uniq_key_name) || raise(::ActiveRecord::RecordNotFound)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def cache_uniq_key(value, uniq_key_name)
|
21
|
+
"uniq_key_#{self.name}_#{uniq_key_name}_#{value}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module SecondLevelCache
|
3
|
+
module ActiveRecord
|
4
|
+
module Associations
|
5
|
+
module HasOneAssociation
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
included do
|
8
|
+
class_eval do
|
9
|
+
alias_method_chain :find_target, :second_level_cache
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_target_with_second_level_cache
|
14
|
+
return find_target_without_second_level_cache unless association_class.second_level_cache_enabled?
|
15
|
+
cache_record = association_class.fetch_by_uniq_key(owner[reflection.active_record_primary_key], reflection.foreign_key)
|
16
|
+
return cache_record.tap{|record| set_inverse_instance(record)} if cache_record
|
17
|
+
|
18
|
+
record = find_target_without_second_level_cache
|
19
|
+
|
20
|
+
record.tap do |r|
|
21
|
+
set_inverse_instance(r)
|
22
|
+
r.write_second_level_cache
|
23
|
+
end if record
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -6,19 +6,14 @@ class ActiveRecord::BaseTest < Test::Unit::TestCase
|
|
6
6
|
@user = User.create :name => 'csdn', :email => 'test@csdn.com'
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
no_connection do
|
11
|
-
assert_not_nil User.read_second_level_cache(@user.id)
|
12
|
-
assert_equal @user, User.find(@user.id)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_should_update_cache_when_update
|
9
|
+
def test_should_expire_cache_when_update_attributes
|
17
10
|
@user.update_attributes :name => 'change'
|
11
|
+
assert_nil User.read_second_level_cache(@user.id)
|
12
|
+
end
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
def test_should_expire_cache_when_update_attribute
|
15
|
+
@user.update_attribute :name, 'change'
|
16
|
+
assert_nil Post.read_second_level_cache(@user.id)
|
22
17
|
end
|
23
18
|
|
24
19
|
def test_should_expire_cache_when_destroy
|
@@ -9,6 +9,8 @@ class ActiveRecord::BelongsToAssociationTest < Test::Unit::TestCase
|
|
9
9
|
def test_should_get_cache_when_use_belongs_to_association
|
10
10
|
book = @user.books.create
|
11
11
|
|
12
|
+
@user.write_second_level_cache
|
13
|
+
book.clear_association_cache
|
12
14
|
no_connection do
|
13
15
|
assert_equal @user, book.user
|
14
16
|
end
|
@@ -12,12 +12,14 @@ class ActiveRecord::FinderMethodsTest < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_should_find_with_cache
|
15
|
+
@user.write_second_level_cache
|
15
16
|
no_connection do
|
16
17
|
assert_equal @user, User.find(@user.id)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
21
|
def test_should_find_with_condition
|
22
|
+
@user.write_second_level_cache
|
21
23
|
no_connection do
|
22
24
|
assert_equal @user, User.where(:name => @user.name).find(@user.id)
|
23
25
|
end
|
@@ -7,7 +7,8 @@ ActiveRecord::Base.connection.create_table(:users, :force => true) do |t|
|
|
7
7
|
end
|
8
8
|
|
9
9
|
class User < ActiveRecord::Base
|
10
|
-
|
10
|
+
CacheVersion = 3
|
11
|
+
acts_as_cached(:version => CacheVersion, :expires_in => 3.day)
|
11
12
|
|
12
13
|
has_many :books
|
13
14
|
has_many :images, :as => :imagable
|
@@ -9,6 +9,8 @@ class ActiveRecord::PolymorphicAssociationTest < Test::Unit::TestCase
|
|
9
9
|
def test_should_get_cache_when_use_polymorphic_association
|
10
10
|
image = @user.images.create
|
11
11
|
|
12
|
+
@user.write_second_level_cache
|
13
|
+
image.clear_association_cache
|
12
14
|
no_connection do
|
13
15
|
assert_equal @user, image.imagable
|
14
16
|
end
|
@@ -7,14 +7,13 @@ class ActiveRecord::SecondLevelCacheTest < Test::Unit::TestCase
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_should_get_cache_key
|
10
|
-
assert_equal "slc/user/#{@user.id}", @user.second_level_cache_key
|
10
|
+
assert_equal "slc/user/#{@user.id}/#{User::CacheVersion}", @user.second_level_cache_key
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_should_write_and_read_cache
|
14
|
+
@user.write_second_level_cache
|
14
15
|
assert_not_nil User.read_second_level_cache(@user.id)
|
15
16
|
@user.expire_second_level_cache
|
16
17
|
assert_nil User.read_second_level_cache(@user.id)
|
17
|
-
@user.write_second_level_cache
|
18
|
-
assert_not_nil User.read_second_level_cache(@user.id)
|
19
18
|
end
|
20
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: second_level_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -93,7 +93,9 @@ files:
|
|
93
93
|
- lib/second_level_cache/active_record.rb
|
94
94
|
- lib/second_level_cache/active_record/base.rb
|
95
95
|
- lib/second_level_cache/active_record/belongs_to_association.rb
|
96
|
+
- lib/second_level_cache/active_record/fetch_by_uniq_key.rb
|
96
97
|
- lib/second_level_cache/active_record/finder_methods.rb
|
98
|
+
- lib/second_level_cache/active_record/has_one_association.rb
|
97
99
|
- lib/second_level_cache/active_record/persistence.rb
|
98
100
|
- lib/second_level_cache/arel/wheres.rb
|
99
101
|
- lib/second_level_cache/config.rb
|
@@ -125,12 +127,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
127
|
- - ! '>='
|
126
128
|
- !ruby/object:Gem::Version
|
127
129
|
version: '0'
|
130
|
+
segments:
|
131
|
+
- 0
|
132
|
+
hash: -453317869
|
128
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
134
|
none: false
|
130
135
|
requirements:
|
131
136
|
- - ! '>='
|
132
137
|
- !ruby/object:Gem::Version
|
133
138
|
version: '0'
|
139
|
+
segments:
|
140
|
+
- 0
|
141
|
+
hash: -453317869
|
134
142
|
requirements: []
|
135
143
|
rubyforge_project:
|
136
144
|
rubygems_version: 1.8.24
|