【问题标题】:Delete 1000k records from table asynchronously using sidekiq使用sidekiq从表中异步删除1000k条记录
【发布时间】:2015-07-14 06:31:24
【问题描述】:

我想从一个表中删除超过 100 万条记录(有时是数百万条记录)。我觉得使用 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

【问题讨论】:

    标签: ruby-on-rails sidekiq


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2013-01-30
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2015-03-04
      相关资源
      最近更新 更多