rails中的session存储问题

Add-ons 的功能基本开发完成,已经进入 beta 测试阶段,之前 session 一直用 FileStore 存储,部署到 production server 之后这样似乎不太靠谱,于是转用 ActiveRecordStore ,这样一方面提高效率,之前的 session 全部以文件形式存储查找慢,用数据建立索引可以加速。另一方面多 server 做 load balance 之后每次请求都可能会在不同的 server 上跳,会出现找不到 session 的情况。这样全部使用统一的 DB 做存储,各个请求之间不共享任何东西,我们也就不用在 web 层和应用层维护任何状态,状态的维护工作被我们放在了一个特定的整合点上,这个叫无共享架构(share-nothing architecture)

Yahoo 这样用 PHP,LiveJournal 这样用 Perl,我们这样用 ROR~ 上面提到的整合点最简单的应该是 ActiveRecordStore,此外还可以用DRbMemcached

使用 ActiveRecordStore 存储 session 第一步建一张存 session 的表,如果你用了 migration,直接rake db:sessions:create 就可以了,自己见表的话用以下 sql

create table sessions (
id int(11) not null auto_increment,
sessid varchar(255),
data text,
updated_at datetime default null,
primary key(id),
index session_index (sessid)
);

然后编辑 config/environment.rb 或者 config/environments/production.rb:

config.action_controller.session_store = :active_record_store

一共两步,搞定 ^-^ 重启 server,访问一下,查查数据库,有了!(Whisper 说 mysql 有内存表,会更快)

删除以前的那些文件 session,这个东西可以删除12小时前的session:

find tmp/sessions -name ‘ruby_sess*’ -ctime +12h -delete

数据库 session 表的删法还要在研究一下 TOT

[Update] 定时删除 session 有一个扩展 ActiveRecord::Session 的方法我没搞出来,后来干脆直接在 crontab 里加了一个任务,执行删除 session 的一个脚本

#!/bin/sh
mysql database_name -uuser_name -ppassword << eof
delete from sessions where date_sub(now(), interval 6 hour) > updated_at and bit_length(data) <= 688;
eof

exit 0;

Reference:
cron, man cron, man 5 crontab
Agile web development with Rails
Rails Wiki

有2 条关于 “rails中的session存储问题”的留言

  • 将session放在db中势必加大数据库负载,而后者通常是网站的最后瓶颈

    -- Yingfeng June 7th, 2007 11:29
  • Yes, 当bottleneck出现在DB上的时候应该把session转移到到内存中 - memcached.

    -- suave.su June 7th, 2007 11:33

发表你的看法

最近主题:

最近评论

  • erick: 搞定了, 从win上转过来的,比较呆, ...
  • erick: 装成功能 了,想用gui工具访问mysql,请...
  • Gary: Did you write this skin for Maxthon? If so, can I...
  • andy: what's iter...
  • g.zhen.ning: 有道理,有点喜欢ruby,不过不知道前...