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