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