Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Xóa Hiệu Quả Redis Set Lớn Không Chặn Server

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

Để xóa một set lớn trong Redis:

  1. Đổi tên khóa thành một khóa duy nhất, có namespace để set xuất hiện như "đã xóa" đối với các Redis client khác ngay lập tức.

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

Lưu ý rằng mã sau không xử lý nhẹ nhàng các lỗi kết nối Redis. Nếu bất kỳ lệnh Redis nào thất bại và ném ngoại lệ, bạn sẽ cần dọn dẹp thủ công.

Mã Giả (Pseudo-code)

# Đổi tên khóa
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.set.key", newkey)
# Xóa thành viên từ set theo lô 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

Ruby

$redis = Redis.new
def delete_set(key)
  # Đổi tên khóa
  newkey = "gc:sets:#{$redis.incr("gc:index")}"
  $redis.rename(key, newkey)
  # Xóa thành viên từ set theo lô 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
# Ví dụ:
# delete_set("my.large.set")

Dưới đây là một số ví dụ triển khai trên sử dụng background jobs trong Ruby:

  • Resque
  • Sidekiq

← Quay lại "Xóa Đối Tượng Lớn Trong Redis"