เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเหตุผลที่การลบออบเจ็กต์ขนาดใหญ่ช้าใน Redis อ่านภาพรวมสั้นๆ นี้
เพื่อลบ Sorted Set ขนาดใหญ่ใน Redis:
เปลี่ยนชื่อคีย์เป็นคีย์เฉพาะที่มี namespace เพื่อให้ Sorted Set ปรากฏว่า "ถูกลบ" แก่ Redis clients อื่นๆ ทันที
ลบสมาชิกจาก Sorted Set แบบเพิ่มทีละน้อยในแบทช์เล็กๆ จนว่าจะว่างเปล่า โดยจำกัดขนาดคำสั่งลบ เรา確保ว่าไม่บล็อกเซิร์ฟเวอร์นานเกินไป
โปรดทราบว่าโค้ดต่อไปนี้ไม่จัดการ Redis connection failures อย่างยืดหยุ่น หากคำสั่ง Redis ใดล้มเหลวและโยน exception คุณจะต้องทำความสะอาดด้วยตนเอง
Pseudo-code
# เปลี่ยนชื่อคีย์ newkey = "gc:hashes:" + redis.INCR("gc:index") redis.RENAME("my.zset.key", newkey) # ลบสมาชิกจาก Sorted Set ในแบทช์ของ 100 while redis.ZCARD(newkey) > 0 redis.ZREMRANGEBYRANK(newkey, 0, 99) end
Ruby
$redis = Redis.new def delete_sorted_set(key) # เปลี่ยนชื่อคีย์ newkey = "gc:zsets:#{$redis.incr("gc:index")}" $redis.rename(key, newkey) # ลบสมาชิกจาก Sorted Set แบบแบทช์ละ 100 while $redis.zcard(newkey) > 0 $redis.zremrangebyrank(newkey, 0, 99) end end # ตัวอย่าง: # # delete_sorted_set("my.large.set")
นี่คือตัวอย่างการนำไปใช้งานข้างต้นด้วย background jobs ใน Ruby:
- Resque
- Sidekiq
← กลับไป "Deleting Large Objects in Redis"