active_cache 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,66 @@
1
1
  = ActiveCache
2
2
 
3
- This project rocks and uses MIT-LICENSE.
3
+ Active cache may be the simple boost for your app. The idea is to store same pages in different states.
4
+
5
+ == Getting started
6
+
7
+ 1. Install the gem
8
+ sudo gem install active_cache
9
+ 2. Make sure that you have memcached installed and running
10
+ sudo apt-get install memcached
11
+ 3. Set cache store in your 'config/application.rb' filea
12
+ config.active_cache_store = ActiveCache::Store::DalliStore
13
+
14
+ == Sample usage
15
+
16
+ Let us suppose that you have controller 'home' containing action 'index' which accepts page parameter do display different content.
17
+
18
+ Normally you would use
19
+ caches_page :index
20
+ But this will cause two problems:
21
+ - it will store only first requested page fe: /home/?page=3, so when user will visit /home/?page=4 he would not receive proper content.
22
+ - most time logged in users see pages slightly different, for example user 'john' may see information 'You are signed in as john'
23
+
24
+ So here comes active_cache, adding line:
25
+ class HomeController < ApplicationController
26
+
27
+ . . .
28
+
29
+ active_cache :index, :state => lambda{ |c| {:page => c.params[:page]} }
30
+
31
+ will cause to store pages dependent of :page. If user visited page /?page=1 - next time he will get this page directly from memory.
32
+
33
+ Also you may want to use cache only when some condition if satisfied (for example store pages in cache only for guests). This may be done by:
34
+
35
+ active_cache :index, :state => lambda{ |c| {:page => c.params[:page]} }, :if => lambda{ |c| !c.user_signed_in? }
36
+
37
+ Next option you can use is :expires_in parameter:
38
+
39
+ active_cache :index, :state => lambda{ |c| {:page => c.params[:page]} }, :expires_in => 100.seconds
40
+
41
+ == Profit
42
+
43
+ First action call will write page content into memory.
44
+
45
+ Example logfile output on first page visit:
46
+ Started GET "/?page=144" for 127.0.0.1 at Tue Nov 08 12:41:47 +0100 2011
47
+ Processing by HomeController#index as HTML
48
+ Parameters: {"page"=>"144"}
49
+ Rendered home/index.html.erb within layouts/application (0.1ms)
50
+ Completed 200 OK in 50ms (Views: 7.3ms | ActiveRecord: 0.0ms)
51
+
52
+ Second page visit:
53
+ Started GET "/?page=144" for 127.0.0.1 at Tue Nov 08 12:41:50 +0100 2011
54
+ Processing by HomeController#index as HTML
55
+ Parameters: {"page"=>"144"}
56
+ Rendered from memory
57
+ Rendered text template (0.0ms)
58
+ Completed 200 OK in 6ms (Views: 5.7ms | ActiveRecord: 0.0ms)
59
+
60
+ so page loading time has been reduced from 50ms to 6ms. Active cache will be cost-effective specially for heavy pages, where lot of content is loaded.
61
+
62
+ I hope you will find this gem useful.
63
+
64
+ PLEASE NOTE THAT THIS IS STILL GERM OF AN IDEA THAT MAY BECOME GOOD SOLUTION. I need to write proper tests, add few options like expiration time et caetera.
65
+
66
+ This project rocks and uses MIT-LICENSE.
@@ -2,7 +2,7 @@ class ActionController::Base
2
2
 
3
3
  def self.active_cache(action, *args)
4
4
  args = args.extract_options!
5
- state, condition = args[:state], (args[:if] || lambda{ true})
5
+ state, condition, expires = args[:state], (args[:if] || lambda{ true}), args[:expires_in]
6
6
  before_filter({:only => action}) do |c|
7
7
  return unless condition.call(c)
8
8
  if p = ActiveCache::cache_store.read(state.call(c).merge!({:action => action}))
@@ -13,7 +13,7 @@ class ActionController::Base
13
13
 
14
14
  after_filter({:only => action}) do |c|
15
15
  return unless condition.call(c)
16
- ActiveCache::cache_store.write(state.call(c).merge!({:action => action}) ,response.body)
16
+ ActiveCache::cache_store.write(state.call(c).merge!({:action => action}), response.body, expires)
17
17
  end
18
18
  end
19
19
 
@@ -2,6 +2,8 @@ require 'action_controller/macros'
2
2
  require 'active_cache/active_cache_store'
3
3
  require 'active_cache/store/dalli_store'
4
4
 
5
+ require 'dalli'
6
+
5
7
 
6
8
  module ActiveCache
7
9
 
@@ -9,16 +9,26 @@ module ActiveCache
9
9
  end
10
10
 
11
11
  def self.read(key)
12
- dc.get(key)
12
+ page = dc.get(key)
13
+ case
14
+ when page.nil?
15
+ nil
16
+ when page[:expires].nil?
17
+ page[:content]
18
+ else
19
+ page[:expires] > Time.now ? page[:content] : nil
20
+ end
13
21
  end
14
22
 
15
23
  def self.write(key, value, expire = nil)
16
- dc.set(key,value)
24
+ expire = Time.now + expire unless expire.nil?
25
+ dc.set(key,{:expires => expire, :content => value})
17
26
  end
18
27
 
19
28
  def self.expire(key)
20
29
  dc.delete(key)
21
30
  end
31
+
22
32
  end
23
33
 
24
34
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveCache
2
- VERSION = "0.0.0"
2
+ VERSION = "0.0.1"
3
3
  end
metadata CHANGED
@@ -1,21 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_cache
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease:
4
+ hash: 29
5
+ prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 0
10
- version: 0.0.0
9
+ - 1
10
+ version: 0.0.1
11
11
  platform: ruby
12
12
  authors:
13
- - 0.0.0
13
+ - Pawel Mikolajewski
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-04 00:00:00 Z
18
+ date: 2011-11-08 00:00:00 +01:00
19
+ default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rails
@@ -71,49 +72,50 @@ extensions: []
71
72
  extra_rdoc_files: []
72
73
 
73
74
  files:
74
- - lib/active_cache.rb
75
75
  - lib/action_controller/macros.rb
76
- - lib/tasks/active_cache_tasks.rake
76
+ - lib/active_cache/active_cache_store.rb
77
77
  - lib/active_cache/store/dalli_store.rb
78
78
  - lib/active_cache/version.rb
79
- - lib/active_cache/active_cache_store.rb
79
+ - lib/active_cache.rb
80
+ - lib/tasks/active_cache_tasks.rake
80
81
  - MIT-LICENSE
81
82
  - Rakefile
82
83
  - README.rdoc
83
84
  - test/active_cache_store_test.rb
84
85
  - test/dummy/config.ru
86
+ - test/dummy/log/test.log
87
+ - test/dummy/Rakefile
85
88
  - test/dummy/script/rails
89
+ - test/dummy/app/views/layouts/application.html.erb
90
+ - test/dummy/app/controllers/application_controller.rb
91
+ - test/dummy/app/helpers/application_helper.rb
92
+ - test/dummy/app/assets/javascripts/application.js
93
+ - test/dummy/app/assets/stylesheets/application.css
86
94
  - test/dummy/public/404.html
87
- - test/dummy/public/favicon.ico
88
- - test/dummy/public/500.html
89
95
  - test/dummy/public/422.html
96
+ - test/dummy/public/500.html
97
+ - test/dummy/public/favicon.ico
90
98
  - test/dummy/config/environment.rb
91
- - test/dummy/config/routes.rb
99
+ - test/dummy/config/application.rb
100
+ - test/dummy/config/database.yml
92
101
  - test/dummy/config/boot.rb
93
- - test/dummy/config/environments/production.rb
94
- - test/dummy/config/environments/development.rb
95
- - test/dummy/config/environments/test.rb
96
- - test/dummy/config/initializers/mime_types.rb
97
- - test/dummy/config/initializers/session_store.rb
102
+ - test/dummy/config/locales/en.yml
98
103
  - test/dummy/config/initializers/inflections.rb
99
104
  - test/dummy/config/initializers/secret_token.rb
100
- - test/dummy/config/initializers/wrap_parameters.rb
101
105
  - test/dummy/config/initializers/backtrace_silencers.rb
102
- - test/dummy/config/locales/en.yml
103
- - test/dummy/config/database.yml
104
- - test/dummy/config/application.rb
106
+ - test/dummy/config/initializers/session_store.rb
107
+ - test/dummy/config/initializers/wrap_parameters.rb
108
+ - test/dummy/config/initializers/mime_types.rb
109
+ - test/dummy/config/routes.rb
110
+ - test/dummy/config/environments/test.rb
111
+ - test/dummy/config/environments/production.rb
112
+ - test/dummy/config/environments/development.rb
105
113
  - test/dummy/db/test.sqlite3
106
- - test/dummy/app/assets/stylesheets/application.css
107
- - test/dummy/app/assets/javascripts/application.js
108
- - test/dummy/app/views/layouts/application.html.erb
109
- - test/dummy/app/helpers/application_helper.rb
110
- - test/dummy/app/controllers/application_controller.rb
111
- - test/dummy/Rakefile
112
- - test/dummy/log/test.log
114
+ - test/action_controller_test.rb
113
115
  - test/dalli_store_test.rb
114
116
  - test/test_helper.rb
115
- - test/action_controller_test.rb
116
117
  - test/active_cache_test.rb
118
+ has_rdoc: true
117
119
  homepage: https://github.com/dfens/active_cache
118
120
  licenses: []
119
121
 
@@ -143,42 +145,42 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
145
  requirements: []
144
146
 
145
147
  rubyforge_project:
146
- rubygems_version: 1.8.11
148
+ rubygems_version: 1.3.7
147
149
  signing_key:
148
150
  specification_version: 3
149
151
  summary: Conditional cache implementation
150
152
  test_files:
151
153
  - test/active_cache_store_test.rb
152
154
  - test/dummy/config.ru
155
+ - test/dummy/log/test.log
156
+ - test/dummy/Rakefile
153
157
  - test/dummy/script/rails
158
+ - test/dummy/app/views/layouts/application.html.erb
159
+ - test/dummy/app/controllers/application_controller.rb
160
+ - test/dummy/app/helpers/application_helper.rb
161
+ - test/dummy/app/assets/javascripts/application.js
162
+ - test/dummy/app/assets/stylesheets/application.css
154
163
  - test/dummy/public/404.html
155
- - test/dummy/public/favicon.ico
156
- - test/dummy/public/500.html
157
164
  - test/dummy/public/422.html
165
+ - test/dummy/public/500.html
166
+ - test/dummy/public/favicon.ico
158
167
  - test/dummy/config/environment.rb
159
- - test/dummy/config/routes.rb
168
+ - test/dummy/config/application.rb
169
+ - test/dummy/config/database.yml
160
170
  - test/dummy/config/boot.rb
161
- - test/dummy/config/environments/production.rb
162
- - test/dummy/config/environments/development.rb
163
- - test/dummy/config/environments/test.rb
164
- - test/dummy/config/initializers/mime_types.rb
165
- - test/dummy/config/initializers/session_store.rb
171
+ - test/dummy/config/locales/en.yml
166
172
  - test/dummy/config/initializers/inflections.rb
167
173
  - test/dummy/config/initializers/secret_token.rb
168
- - test/dummy/config/initializers/wrap_parameters.rb
169
174
  - test/dummy/config/initializers/backtrace_silencers.rb
170
- - test/dummy/config/locales/en.yml
171
- - test/dummy/config/database.yml
172
- - test/dummy/config/application.rb
175
+ - test/dummy/config/initializers/session_store.rb
176
+ - test/dummy/config/initializers/wrap_parameters.rb
177
+ - test/dummy/config/initializers/mime_types.rb
178
+ - test/dummy/config/routes.rb
179
+ - test/dummy/config/environments/test.rb
180
+ - test/dummy/config/environments/production.rb
181
+ - test/dummy/config/environments/development.rb
173
182
  - test/dummy/db/test.sqlite3
174
- - test/dummy/app/assets/stylesheets/application.css
175
- - test/dummy/app/assets/javascripts/application.js
176
- - test/dummy/app/views/layouts/application.html.erb
177
- - test/dummy/app/helpers/application_helper.rb
178
- - test/dummy/app/controllers/application_controller.rb
179
- - test/dummy/Rakefile
180
- - test/dummy/log/test.log
183
+ - test/action_controller_test.rb
181
184
  - test/dalli_store_test.rb
182
185
  - test/test_helper.rb
183
- - test/action_controller_test.rb
184
186
  - test/active_cache_test.rb