Rails:从 Active Record 会话存储迁移到 Redis 存储

4
我有一个庞大的应用程序,有成千上万的活动会话。我想使用这个将其迁移到Redis会话存储中。理想情况下,我希望我的当前会话保持活动状态。
有人有迁移活动会话的经验吗?我认为我需要编写迁移或rake任务(我认为是迁移,以便在此过程中删除旧表),并且我想将所有当前详细信息写入Redis中。
old_sessions = ActiveRecord::Base.connection.select_all("select * from sessions")
old_sessions.each { |session| $redis.set(????? ????) }

但我担心数据完整性。

1个回答

13

好了,在经过一天的研究后,这是我想出来的:

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

我将这个放在这里作为一个参考。或者,如果你发现有什么不对的地方,我非常乐意听取意见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接