Computer >> Máy Tính >  >> Lập trình >> Redis

Xóa các tập hợp lớn trong Redis

Để tìm hiểu thêm về lý do tại sao việc xóa các đối tượng lớn bị chậm trong Redis, hãy đọc phần tổng quan nhanh này

Để xóa một tập hợp lớn trong Redis:

  1. Đổi tên khóa thành một khóa có không gian tên, duy nhất để tập hợp có vẻ "đã bị xóa" đối với các ứng dụng khách Redis khác ngay lập tức.

  2. Xóa dần các thành viên khỏi tập hợp theo từng đợt nhỏ cho đến khi nó trống. Bằng cách giới hạn kích thước lệnh xóa của chúng tôi, chúng tôi đảm bảo rằng chúng tôi không chặn máy chủ quá lâu.

Xin lưu ý rằng đoạn mã sau không xử lý các lỗi kết nối Redis một cách linh hoạt. Nếu bất kỳ lệnh Redis nào không thành công và tạo ra một ngoại lệ, bạn sẽ cần xóa thủ công.

Mã giả

# Rename the key
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.set.key", newkey)

# Delete members from the set in batches of 100
cursor = 0
loop
  cursor, members = redis.SSCAN(newkey, cursor, "COUNT", 100)
  if size of members > 0
    redis.SREM(newkey, members)
  end
  if cursor == 0
    break
  end
end

Hồng ngọc

$redis = Redis.new

def delete_set(key)
  # Rename the key
  newkey = "gc:sets:#{$redis.incr("gc:index")}"
  $redis.rename(key, newkey)

  # Delete members from the set in batches of 100
  cursor = "0"
  loop do
    cursor, members = $redis.sscan(newkey, cursor, count: 100)
    $redis.srem(newkey, members) if members.size > 0
    break if cursor == "0"
  end
end

# Example:
#
#   delete_set("my.large.set")

Dưới đây là một số cách triển khai ví dụ ở trên bằng cách sử dụng công việc nền trongRuby:

  • Yêu cầu lại
  • Sidekiq

← Quay lại “Xóa các đối tượng lớn trong Redis”