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