Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

ลบ Redis Sets ขนาดใหญ่โดยไม่บล็อกเซิร์ฟเวอร์: วิธีที่มีประสิทธิภาพ

เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเหตุผลที่การลบออบเจ็กต์ขนาดใหญ่ช้าใน Redis อ่านภาพรวมสั้นๆ นี้

เพื่อลบ Set ขนาดใหญ่ใน Redis:

  1. เปลี่ยนชื่อคีย์เป็นคีย์เฉพาะที่มี namespace เพื่อให้ Set ปรากฏว่า "ถูกลบ" แก่ Redis clients อื่นๆ ทันที

  2. ลบสมาชิกจาก 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"