2012-08-13 100 views
3

我有一个大型应用程序,可以存储多达数千个活动会话。我想使用this迁移到Redis会话存储中。理想情况下,我希望我的当前会话保持活跃。Rails:从活动记录会话存储转移到Redis存储

有没有人在迁移活动会话方面有任何经验。我假设我写了一个迁移或rake任务(我认为迁移,因此我可以删除旧表作为其中的一部分),并且我只想写入redis所有当前的详细信息。

old_sessions = ActiveRecord::Base.connection.select_all("select * from sessions") 
old_sessions.each { |session| $redis.set(????? ????) } 

但是我很担心数据的完整性。

回答

12

好吧,黑客这个了一整天后,这里就是我想出了:

class MoveActiveRecordSesionsIntoRedis < ActiveRecord::Migration 
    def up 
    #get all the sessions from the last month 
    old_sessions = ActiveRecord::Base.connection.select_all("select * from sessions where updated_at > '#{Time.now - 1.month}'") 

    old_sessions.each do |session| 


     #convert the base64 data back into the object 
     data = ActiveRecord::SessionStore::Session.unmarshal(session["data"]) 

     #load each session into Redis, dumping the object appropriately  
     $redis.setex session["session_id"], 
        1.month.to_i, 
        Marshal.dump(data).to_s.force_encoding(Encoding::BINARY) 
    end 

    #drop the old session table (So long unecessary 3Gigs!) 
    drop_table :sessions 
    end 

    def down 
    raise ActiveRecord::IrreversibleMigration, "Session face-plant!" 
    end 
end 

我把这个在这里作为参考。或者,如果你看到有什么问题,我全都是耳朵。