หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสาเหตุที่การลบวัตถุขนาดใหญ่ใน Redis ได้ช้า โปรดอ่านภาพรวมโดยย่อ
วิธีลบแฮชขนาดใหญ่ใน Redis:
-
เปลี่ยนชื่อคีย์เป็นคีย์เนมสเปซที่ไม่ซ้ำกันเพื่อให้แฮชปรากฏเป็น "ลบ" ให้กับลูกค้า Redis อื่นทันที
-
ลบฟิลด์ทีละน้อยจากแฮชเป็นกลุ่มเล็กๆ จนกว่าจะว่าง โดยการจำกัดขนาดของคำสั่งลบ เรารับรองว่าเราจะไม่บล็อกเซิร์ฟเวอร์นานเกินไป
โปรดทราบว่าโค้ดต่อไปนี้ไม่สามารถจัดการกับ Redis connectionfailures ได้อย่างสวยงาม หากคำสั่ง Redis ล้มเหลวและทำให้เกิดข้อยกเว้น คุณจะต้องล้างข้อมูลด้วยตนเอง
รหัสหลอก
# Rename the key
newkey = "gc:hashes:" + redis.INCR( "gc:index" )
redis.RENAME("my.hash.key", newkey)
# Delete fields from the hash in batche of 100s
cursor = 0
loop
cursor, hash_keys = redis.HSCAN(newkey, cursor, "COUNT", 100)
if hash_keys count > 0
redis.HDEL(newkey, hash_keys)
end
if cursor == 0
break
end
end
ทับทิม
$redis = Redis.new
def delete_hash(key)
# Rename the key
newkey = "gc:hashes:#{$redis.incr("gc:index")}"
$redis.rename(key, newkey)
# Delete fields from the hash in batches of 100
cursor = "0"
loop do
cursor, fields = $redis.hscan(newkey, cursor, count: 100)
hkeys = fields.map { |pair| pair[0] }
$redis.hdel(newkey, hkeys) if hkeys.size > 0
break if cursor == "0"
end
end
# Example:
#
# delete_hash("my.large.hash")
ต่อไปนี้คือตัวอย่างการใช้งานด้านบนโดยใช้งานพื้นหลัง inRuby:
- รีเควส
- ไซด์คิก
← กลับไปที่ “การลบวัตถุขนาดใหญ่ใน Redis”