注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风之云的足迹

点击这里添加博客描述

 
 
 

日志

 
 

Rails中memcache存储session  

2011-05-03 18:26:03|  分类: Rails |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Rails中memcache技术调研

1.memcache介绍
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据 库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目); 当某个服务器停止运行或崩溃了,所有存放在服务器上的键/值对都将丢失。

2.memcache配置

服务端的配置
安装见:http://www.ccvita.com/257.html
memcache官网: http://memcached.org/
安装完成之后需要开启内存空间使用命令 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

客户端的配置
因为客户端用的是Rails,需要需要安装Ruby的客户端,安装命令: gem install memcache-client

3. Ruby中memcache简单使用

require 'memcache' 
require 'memcache_util' # 需要加载的模块
MEMCACHE_OPTIONS = {:debug => false,
:namespace => 'kevin',
:readonly => false} # 配置信息
MEMCACHE_CONFIG = "172.19.0.234:11212" # 链接的服务器地址以及端口
CACHE = MemCache.new MEMCACHE_OPTIONS
CACHE.servers = MEMCACHE_CONFIG
CACHE.set('name','QA') # 设置相应的值到内存中,已hash的形式存储,可以存储对象等
puts CACHE.get('name') # 获取存储中的相应值
CACHE.delete('name') # 删除cache中的hash值
puts CACHE.get('name') # nil



当在另外一个应用中也配置了相同的ip和端口的memcache后,能够获取到其它应用保存的数据,实现数据共享。

4. rails中memcache方式存储session

1、首先在environment.rb文件中配置memcache相关链接参数

require 'memcache'
require 'memcache_util'
# memcache defaults, environments may override these settings
unless defined? MEMCACHE_OPTIONS then
MEMCACHE_OPTIONS = {:debug => false,
:namespace => "mem-#{RAILS_ENV}",
:readonly => false}
end
# memcache configuration
unless defined? MEMCACHE_CONFIG then
File.open "#{RAILS_ROOT}/config/memcached.yml" do |memcache|
MEMCACHE_CONFIG = YAML::load memcache
end
end
# Connect to memcache
unless defined? CACHE then
CACHE = MemCache.new MEMCACHE_OPTIONS
CACHE.servers = MEMCACHE_CONFIG[RAILS_ENV]
end


2、在environment.rb的config中修改session的存储方式为memcache,以及设置session的过期时间等配置
 config.action_controller.session_store = :mem_cache_store
config.action_controller.session = {
:session_key => "mem-#{RAILS_ENV}",
:secret => 'someotherkindofsecretthatnooneknows',
:cache => CACHE,
:expires=> 900 }


secret参数的作用:
Rails2.x后引入了防止跨域访问攻击的pluging,具体操作如下
在控制器中定义protect_from_forgery钩子,在模版中使用form_for等标签时,服务器会在生成form_for等标签时建立一个 密钥(token),服务器会监视request回来的所有post以及AJAX行为,如果request没有token或者与服务器计算出的不一致,将 返回错误信息。
cookiestore的session存储机制下,token是根据CGI::Session.generate_unique_id生成的随即数并进行编码得到的,所以不需要为protect_from_forgery设置secret的键值
:active_record_store或者:mem_cache_store是根据session_id、protect_from_forgery的secret的值以及digest(默认是SHA1)计算得来,所以要为这种session机制设置secret值。

3、步骤1中需要从memcached.yml文件中加载服务器信息,需要在config目录下新建memcached.yml文件,内容如下
production:
- 172.19.0.234:11212
development:
- 172.19.0.235:11212
- 172.19.0.234:11212


可以按照开发环境配置不同的memcache地址。
同时对于production环境下配置两个memcache地址,并且保证两个地址都是能用的,这样子缓存的数据在一个服务器上找不到会去另外一个服务器上寻找。
如果只是配置一个memcache,memcache服务器down掉的话会导致应用全部是500错误,所以线上环境必须配置两个memcache保证线上应用的安全。
  评论这张
 
阅读(1533)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018