Memcached+Rails

Posted by HoLin on February 20th, 2008 filed in Rails应用, 部署与优化

本文介绍了Memcached在rails中的应用,内容涵盖memcached介绍、安装,在rails中的配置,具体使用的例子。

测试环境为Ubuntu7.10 + Rails2.0.1 + MySQL5.0.45 + Memcached 1.2.4

介绍
memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached官方站点

安装
memcached安装过程

wget http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz
tar -xzvf memcached-1.2.4.tar.gz
sudo ./configure checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/
 
If it is already installed, specify its path using --with-libevent=/dir/
cd ..
wget http://www.monkey.org/~provos/libevent-1.3e.tar.gz
tar xzvf libevent-1.3e.tar.gz
sudo ./configure && sudo make && sudo make install
sudo gem install memcache-client
 
$ memcached --help
memcached: error while loading shared libraries: libevent-1.3e.so.1: cannot open shared object file: No such file or directory
 
ln -s /usr/local/lib/libevent-1.3e.so.1 /lib/
 
memcached -d -m 48 -l 127.0.0.1 -p 11211

cached_model安装

sudo gem install cached_model

cached_model是用来缓存单条纪录的,依赖于memcache-client,安装的同时也会把memcache-client装上,如果不缓存单条纪录,应该可以不装cached_model,具体我没有试过。
rails中的配置
配置environment.rb

1
2
3
4
5
6
7
8
9
10
11
12
require 'cached_model'
memcache_options = {
:c_threshold => 10_000,
:compression => true,
:debug =>false,
:namespace => 'my_rails_app',
:readonly => false,
:urlencode =>false
}
 
CACHE = MemCache.new memcache_options
CACHE.servers = ['localhost:11211', 'localhost:11212'] #这里我启动了两个memcached server

这里的文档,好像options只有:namespace, :readonly, :multithread

具体使用
设置session storage为memcachedenvironment.rb中做如下修改:

# config.action_controller.session_store = :active_record_store
config.action_controller.session_store = :mem_cache_store

自动缓存model

参考的很多资料像下面这么说,但是在我的环境下没有成功,我也把步骤整理在这

*将需要缓存的model由原来继承自ActiveRecord::Base改为继承自CachedModel?

class Foo< CachedModel
end

*运行console

>>Foo.find 1
>MemCache Get (0.134546)  active_record:Foo:1
>SELECT * FROM foos WHERE (foos.id = 1) LIMIT 1
>MemCache Set (0.024758)  active_record:Foo:1 &gt;&gt;Foo.find 1
>MemCache Get (0.032337)  active_record:Foo:1<code>
<pre>手动缓存
<pre lang="rails" line="1">require 'md5'
k = MD5.new("sql condition here")
qs = Cache.get k
if qs.blank?
	puts "===============================no cached"
	qs = Foo.find(:all, :conditions =&gt; "sql condition here")
	Cache.put k, qs, 60*30 #expire after 30min
end

我在qs = Cache.get k这一行出现了undifined module/class :Foo这样的异常,在get的时候会执行 Marshal.load, 找不到Foo类,google之后,在前面调用Foo.class先载入Foo class后消除异常。

参考
memcached官方站点
Memcached Basics for Rails
Memcachedb,新浪发起的开源软件项目

No related posts.

Leave a Comment