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

Xóa các băm 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 hàm băm 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 để mã băm xuất hiện "đã 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 trường khỏi băm 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.hash.key", newkey)

# Delete fields from the hash in batche of 100s
cursor = 0
loop
  cursor, hash_keys = redis.HSCAN(newkey, cursor, "COUNT", 100)
  if hash_keys count > 0
    redis.HDEL(newkey, hash_keys)
  end
  if cursor == 0
    break
  end
end

Hồng ngọc

$redis = Redis.new

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

  # Delete fields from the hash in batches of 100
  cursor = "0"
  loop do
    cursor, fields = $redis.hscan(newkey, cursor, count: 100)
    hkeys = fields.map { |pair| pair[0] }
    $redis.hdel(newkey, hkeys) if hkeys.size > 0
    break if cursor == "0"
  end
end

# Example:
#
#   delete_hash("my.large.hash")

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”