เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเหตุผลที่การลบออบเจ็กต์ขนาดใหญ่ช้าใน Redis อ่านภาพรวมสั้นๆ นี้
เพื่อลบ Set ขนาดใหญ่ใน Redis:
เปลี่ยนชื่อคีย์เป็นคีย์เฉพาะที่มี namespace เพื่อให้ Set ปรากฏว่า "ถูกลบ" แก่ Redis clients อื่นๆ ทันที
ลบสมาชิกจาก Set แบบเพิ่มทีละน้อยในแบทช์เล็กๆ จนว่าจะว่างเปล่า โดยจำกัดขนาดคำสั่งลบ เรา确保ว่าไม่บล็อกเซิร์ฟเวอร์นานเกินไป
โปรดทราบว่าโค้ดต่อไปนี้ไม่จัดการ Redis connection failures อย่างยืดหยุ่น หากคำสั่ง Redis ใดล้มเหลวและโยน exception คุณจะต้องทำความสะอาดด้วยตนเอง
Pseudo-code
# เปลี่ยนชื่อคีย์ newkey = "gc:hashes:" + redis.INCR("gc:index") redis.RENAME("my.set.key", newkey) # ลบสมาชิกจาก Set ในแบทช์ของ 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) # เปลี่ยนชื่อคีย์ newkey = "gc:sets:#{$redis.incr("gc:index")}" $redis.rename(key, newkey) # ลบสมาชิกจาก Set ในแบทช์ของ 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 # ตัวอย่าง: # # delete_set("my.large.set")
นี่คือตัวอย่างการนำไปใช้งานข้างต้นด้วย background jobs ใน Ruby:
- Resque
- Sidekiq
← กลับไป "Deleting Large Objects in Redis"