Rails 中session存储问题

Rails Session Store

 

session 一直用 FileStore 存储,但是当session存储的东西太多会数据溢出,cookie 的存储的最大值为4k,于是转用 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值