使用sidekiq异步删除表中的1000k记录

时间:2015-07-14 06:31:25

标签: ruby-on-rails sidekiq

我想从表中删除超过1000k条记录(有时是数百万条记录)。我觉得使用sidekiq和Redis异步进行是安全的,因为我正在使用Ruby和Sinatra。

什么时候我应该调用sidekiq的“执行”方法?我需要在哪里运行我需要删除的记录循环? 任何人都可以解释如何使用sidekiq将要删除的记录放入队列吗?

这是我的代码,请检查并告诉我是否遵守了正确的代码。

在我的用户控制器中:

def delete_user
   DeleteUserWorker.perform_async(@client_info, @input_params)
end

在我的lib / workers / deleteuser_worker.rb

class DeleteUserWorker
  include Sidekiq::Worker

  def perform(client_info, input_params)
       # executes the query and fetches non-active records from users table.
      @delete_users = User.where("status != ? and EndDate < ?", "active", 3.months.ago )
      @delete_users.each do |user|
         user.destroy!
      end

  end
end

1 个答案:

答案 0 :(得分:0)

如果您要遍历数百万条记录,则应使用find_each或find_in_batches而不是每条记录(因为.each会尝试一次实例化所有对象):

  @delete_users.find_each do |user|
     user.destroy!
  end

更多信息: http://api.rubyonrails.org/classes/ActiveRecord/Batches.html