Để 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:
-
Đổ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.
-
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”