Để 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 sorted set lớn trong Redis:
-
Đổi tên khóa (rename) thành một khóa duy nhất, có namespace để sorted 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 (incrementally) các thành viên từ sorted set theo lô nhỏ (small batches) 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 (gracefully) 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.zset.key", newkey)
# Xóa thành viên từ sorted set theo lô 100
while redis.ZCARD(newkey) > 0
redis.ZREMRANGEBYRANK(newkey, 0, 99)
end
Ruby
$redis = Redis.new
def delete_sorted_set(key)
# Đổi tên khóa
newkey = "gc:zsets:#{$redis.incr("gc:index")}"
$redis.rename(key, newkey)
# Xóa thành viên từ sorted set theo lô 100
while $redis.zcard(newkey) > 0
$redis.zremrangebyrank(newkey, 0, 99)
end
end
# Ví dụ:
# delete_sorted_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"