Friday, February 5, 2010

memcached in rails on Mac and Windows 7

Rails use the following caching methods:

Page Caching
Action Caching
Fragment Caching
Sweepers
SQL Caching


Page caching is to cache a full page in a controller logic. It ignores parameters and good for stateless page not for stateful page that we used to have. Page caches are always stored on disk.

Action caching is to cache a full action response in a controller logic. Before caching, we can add before_filter in order to add more functions such as authentication.

Fragment Caching is to cache a part of a page in a view logic. It does not dramatically improve performance as Page and Action cachings do. It is implemented with Action caching.

You need to insert expire_{page,action,fragment} calls normally in create, update, and destroy actions in order to delete caches. However, Cache sweeping (Sweepers) is an automatic mechanism which allows you to get around having a ton of expire_{page,action,fragment} calls in your code. Sweeper needs an "observe" that observes a model to be changed. Once you have a sweeper class, the sweeper has to be added to the controller that will use it.

Query caching is a Rails feature that caches the result set returned by each query. If Rails encounters the same query again during the current request, it will used the cached result set as opposed to running the query against the database.

Cache Stores

Caching data is stored at disk, memory, and DB.

1. ActiveSupport::Cache::MemoryStore: A cache store implementation which stores everything into memory in the same process.
2. ActiveSupport::Cache::FileStore: Cached data is stored on the disk. This is the default store and the default path for this store is: /tmp/cache.
3. ActiveSupport::Cache::DRbStore: Cached data is stored in a separate shared DRb process that all servers communicate with.
4. MemCached store: Works like DRbStore, but uses Danga's MemCache instead. Rails uses the bundled memcached-client gem by default. This is currently the most popular cache store for production websites. It also needs to run memcached server. We will use MemCached store here.
5. ActiveSupport::Cache::SynchronizedMemoryStore: Like ActiveSupport::Cache::MemoryStore but thread-safe.
6. ActiveSupport::Cache::CompressedMemCacheStore: Works just like the regular MemCacheStore but uses GZip to decompress/compress on read/write
7. Custom store: You can define your own cache store
We are using #4 MemCached store for both session and cache. In order to use it, memcached server should be run separately with rails server. In order to install memcached, you need to follow as:

MAC [4]

sudo port install memcached

Once you have memcache you'll want to start it running:

memcached -vv

The -vv puts memcache in Very Verbose mode so you get to see all the action. You'll run this as a daemon once you're ready to go for real (replace -vv with -d).

For Ruby we're using memcache-client and you'll need the gem:

sudo gem install memcache-client

Windows [5, 6]

1. Install MemCached (http://www.danga.com/memcached/). For windows download binaries and manually install. It is well explained in the site.

2. Install Memcached-Client

# gem install memcache-client
3. Start the memcached Server. It says Start the server from the Microsoft Management Console or by running the following command:

'c:\memcached\memcached.exe -d start'

However, it did not work on my Windows 7. You can go to the folder of memcached installed and just double-click on "memcached.exe" at window explorer. It'll run in port 11211. Besides, in the command prompt window, for example, at c:\memcached, you can type in

memcached -vv -P /tmp/memcached.pid

It will display cache object.

References

1. http://guides.rubyonrails.org/caching_with_rails.html
2. http://townx.org/rails_and_memcached
3. http://nubyonrails.com/articles/memcached-basics-for-rails
4. http://www.ridingtheclutch.com/2009/01/08/cache-anything-easily-with-rails-and-memcached.html
5. http://ratnaonrails.wordpress.com/2008/07/17/memcached-in-rails/
6. http://www.splinedancer.com/memcached-win32/

No comments:

Post a Comment