Redis ZSCAN

Redis Zscan



วนซ้ำสมาชิกของชุดที่เรียงลำดับ

อย่างที่คุณทราบ ชุดการเรียงลำดับ Redis นั้นมาจากชุดปกติที่สมาชิกแต่ละคนจะเรียงลำดับตามค่าคะแนนในลำดับจากน้อยไปมาก ถ้าสมาชิกสองคนขึ้นไปมีค่าคะแนนเท่ากัน พวกเขาจะเรียงลำดับตามพจนานุกรม โดยปกติ สมาชิกและคะแนนสามารถเรียกค้นได้โดยตรงโดยใช้คำสั่ง ZRANGE เมื่อคุณมีชุดการเรียงลำดับขนาดใหญ่ที่มีสมาชิกหลายพันคน คำสั่ง ZRANGE อาจบล็อกเซิร์ฟเวอร์เป็นเวลานาน เช่น คำสั่ง SMEMBERS และ KEYS ซึ่งเป็นข้อเสียเปรียบ ดังนั้น Redis จึงเสนอคำสั่งพิเศษที่เรียกว่า ZSCAN ซึ่งได้มาจากคำสั่ง SCAN เพื่อวนซ้ำสมาชิกของชุดที่จัดเรียง เนื่องจากคำสั่ง ZSCAN สืบทอดมาจากคำสั่ง SCAN ลักษณะการทำงานเกือบทั้งหมดจะเหมือนกับคำสั่ง SCAN วัตถุประสงค์ทั่วไป







ดังในรูปที่กำหนด คำสั่ง SCAN เป็นตัววนซ้ำแบบอิงเคอร์เซอร์ ดังนั้น จึงต้องใช้การทำซ้ำอย่างน้อยหนึ่งครั้งเพื่อจัดเตรียมรายการทั้งหมดของคอลเล็กชัน Redis เนื่องจากคำสั่ง ZSCAN สืบทอดมาจากคำสั่ง SCAN พาเรนต์ ลักษณะการทำงานจึงเหมือนกัน ในคู่มือนี้ ไวยากรณ์และกรณีการใช้งานของคำสั่ง ZSCAN จะกล่าวถึงโดยละเอียด



คำสั่ง ZSCAN

คำสั่ง ZSCAN เป็นตัววนซ้ำตามเคอร์เซอร์ที่เริ่มการวนซ้ำด้วยเคอร์เซอร์ตัวที่ 0 หลังจากนั้น ในการวนซ้ำแต่ละครั้ง จะคืนค่าสมาชิกชุดที่จัดเรียงเป็นศูนย์หรือมากกว่าพร้อมกับเคอร์เซอร์ถัดไปที่ควรใช้เป็นเคอร์เซอร์สำหรับการเรียกคำสั่งต่อไปนี้ หากเคอร์เซอร์ที่ส่งคืนเป็น 0 หลังจากการวนซ้ำอย่างน้อยหนึ่งครั้ง แสดงว่ากระบวนการสแกนสิ้นสุดลง สมาชิกชุดที่เรียงลำดับทั้งหมดจะถูกส่งคืน ณ จุดนี้ กระบวนการนี้เรียกว่าการวนซ้ำแบบเต็ม อย่างที่คุณเห็น คำสั่ง ZSCAN จะคงสถานะไว้โดยใช้เคอร์เซอร์เท่านั้น ซึ่งนำไปสู่การรับรู้สถานะที่จำกัด ดังนั้น ข้อเสียต่อไปนี้จะเชื่อมโยงกับคำสั่ง ZSCAN



  • องค์ประกอบเดียวกันอาจกลับมาซ้ำหลายครั้ง
  • หากไม่มีสมาชิกในตอนเริ่มต้นของกระบวนการสแกน มีความเป็นไปได้ที่จะไม่ส่งคืนสมาชิกนั้นในระหว่างการทำซ้ำแบบเต็ม

นอกจากนี้ ไม่มีการค้ำประกันในการนับจำนวนสมาชิกที่ส่งคืน ในบางกรณี ถ้าชุดที่จัดเรียงมีขนาดเล็กมาก สมาชิกทั้งหมดอาจถูกส่งคืนในการทำซ้ำครั้งแรก เนื่องจาก Redis ใช้รูปแบบการเข้ารหัสที่บรรจุการจัดสรรครั้งเดียวแบบพิเศษเพื่อเก็บสมาชิกไว้จนกว่าจะถึงจำนวนรายการสูงสุด คำสั่ง ZSCAN สามารถส่งคืนเคอร์เซอร์ได้ก็ต่อเมื่อโครงสร้างข้อมูลที่สแกนแสดงเป็นตารางแฮช





ไวยากรณ์:
คำสั่ง ZSCAN ใช้ไวยากรณ์เกือบเดียวกันกับคำสั่ง SCAN ยกเว้นว่าจะยอมรับชุดคีย์ที่จัดเรียงเป็นอาร์กิวเมนต์แรก ไวยากรณ์คำสั่งพร้อมอาร์กิวเมนต์ที่อนุญาตมีดังนี้:

ZSCAN sorted_set_key เคอร์เซอร์ [ รูปแบบการจับคู่ ] [ COUNT member_count ]

sorted_set_key : คีย์ของชุดที่จัดเรียง
เคอร์เซอร์ : ค่าเคอร์เซอร์เริ่มต้นจาก 0 และสิ้นสุดที่ 0 หากเป็นการวนซ้ำแบบเต็ม



อาร์กิวเมนต์ต่อไปนี้เป็นทางเลือก:

การแข่งขัน : รูปแบบที่ตรงกันเมื่อดึงองค์ประกอบในการวนซ้ำแต่ละครั้ง ส่งคืนเฉพาะสมาชิกที่ตรงกันเท่านั้น
นับ : จำนวนสมาชิกโดยประมาณที่จะส่งคืนในการทำซ้ำแต่ละครั้ง

ชุดผลลัพธ์ที่ส่งคืนต่อการวนซ้ำประกอบด้วยองค์ประกอบสองสามอย่าง ส่วนแรกเป็นจำนวนเต็ม 64 บิตที่ไม่ได้ลงนามซึ่งแทนเคอร์เซอร์ที่จะส่งผ่านไปยังการโทรครั้งต่อไป ส่วนต่อไปเป็นอาร์เรย์ของสมาชิกและคะแนนที่เกี่ยวข้อง

ใช้กรณีที่ 1 – เรียกสมาชิกทั้งหมดและภารกิจที่เสร็จสมบูรณ์ของเกมออนไลน์

สมมติว่าบริษัทเกมออนไลน์รักษากระดานผู้นำโดยใช้ชุดการเรียงลำดับ Redis เนื่องจากผู้ใช้จำนวนมากกำลังเล่นเกมอย่างแข็งขัน พวกเขาต้องการวิธีดึงผู้เล่นแต่ละคนและคะแนนที่เกี่ยวข้องซึ่งเป็นจำนวนภารกิจที่เสร็จสิ้น จำเป็นต้องดำเนินการดึงข้อมูลโดยไม่ปิดกั้นเซิร์ฟเวอร์ ดังนั้น แนะนำให้ใช้คำสั่ง ZSCAN ดังนี้:

อันดับแรก เราสร้างชุดที่จัดเรียงไว้กับผู้เล่นบางคนและจำนวนภารกิจที่เสร็จสิ้น

zadd ลีดเดอร์บอร์ด 12 ผู้เล่น6:จอห์น 4 ผู้เล่น2:แมรี่ 22 Player1:Patel สิบห้า ผู้เล่น: สิบเอ็ด 23 ผู้เล่น5:แอน 30 ผู้เล่น7:Harsh 23 Player12:แอ๊บบี้ สอง Player13:นิกกี้ 6 Player9:เจเรมี 7 ผู้เล่น45:Kina

ตอนนี้ เราสามารถวนซ้ำสมาชิกของชุดที่เรียงลำดับได้ดังนี้:

zscan ลีดเดอร์บอร์ด 0

เอาท์พุท:

ค่าเคอร์เซอร์คือ 0 ในชุดผลลัพธ์ที่ส่งคืน ซึ่งหมายความว่าสมาชิกทั้งหมดจะถูกส่งคืนเมื่อสิ้นสุดการวนซ้ำครั้งแรก ในกรณีนี้ เนื่องจากจำนวนสมาชิกมีน้อย Redis จึงเป็นตัวแทนของสมาชิกเหล่านี้โดยใช้การเข้ารหัสแบบแพ็กการจัดสรรครั้งเดียว ดังนั้น จนกว่าจะถึงขนาดแพ็คสูงสุดหรือจำนวนสมาชิก คำสั่งจะส่งคืนสมาชิกทั้งหมดในชุดที่เรียงลำดับ นี้เรียกว่าการวนซ้ำแบบเต็ม เพราะเมื่อสิ้นสุดการทำซ้ำครั้งแรก เราได้รับสมาชิกทั้งสิบคนและคะแนนของพวกเขา ถ้าเรามีสมาชิกหลายร้อยคน จะแสดงเป็นตารางแฮชในหน่วยความจำ จึงต้องทำซ้ำหลายครั้งเพื่อคืนสมาชิกทั้งหมด

พารามิเตอร์ COUNT สามารถใช้เพื่อจำกัดจำนวนสมาชิกที่ส่งคืนในการวนซ้ำ โดยค่าเริ่มต้น อาร์กิวเมนต์นี้ถูกตั้งค่าเป็น 10 ถ้าชุดที่เรียงลำดับประกอบด้วยสมาชิกหลายร้อยคน อาร์กิวเมนต์นี้จะถูกแทนด้วยตารางแฮชในหน่วยความจำ ดังนั้น จำนวนสมาชิกที่ส่งคืนจะอยู่ที่ประมาณสิบครั้งต่อการทำซ้ำ ค่าของอาร์กิวเมนต์ COUNT จะถูกละเว้นหากชุดที่จัดเรียงมีขนาดเล็กเกินไป

ใช้กรณีที่ 2 – เรียกผู้เล่นที่มีชื่อขึ้นต้นด้วยตัวอักษร 'J'

คำสั่ง ZSCAN สามารถใช้เพื่อกรองสมาชิกที่ส่งคืนตามการจับคู่รูปแบบ ในกรณีนั้น ต้องระบุอาร์กิวเมนต์ MATCH

ลองใช้ตัวอย่างเดียวกันจากกรณีการใช้งานครั้งก่อน ข้อกำหนดคือการเรียกผู้เล่นที่มีชื่อขึ้นต้นด้วยตัวอักษร 'J' เป็นเพียงการนำคุณสมบัติเจ๋ง ๆ ที่เกี่ยวข้องกับเกมไปใช้ อาร์กิวเมนต์ MATCH สามารถระบุได้ดังนี้:

zscan ลีดเดอร์บอร์ด 0 การแข่งขัน * เจ *

สิ่งนี้ควรส่งคืนสมาชิกสองคนที่มีชื่อคือเจเรมีและจอห์น

บทสรุป

โดยสรุป คำสั่ง ZSCAN ใช้เพื่อวนซ้ำสมาชิกและคะแนนของชุดที่จัดเรียง Redis คำสั่งนี้ทำงานเหมือนกับคำสั่ง SCAN ยกเว้นว่าคำสั่ง ZSCAN ยอมรับ set key เป็นอาร์กิวเมนต์แรก ตามที่กล่าวไว้ในกรณีการใช้งาน คำสั่ง ZSCAN สามารถใช้ในรูปแบบต่างๆ โดยการระบุอาร์กิวเมนต์ MATCH และ COUNT ซึ่งคุณสามารถดึงข้อมูลสมาชิกและคะแนนที่เกี่ยวข้องซึ่งตรงกับรูปแบบเฉพาะ และจำกัดจำนวนสมาชิกที่ส่งคืนต่อการทำซ้ำ โดยรวมแล้ว คำสั่ง ZSCAN จะมีประโยชน์เมื่อดึงข้อมูลสมาชิกของชุดที่จัดเรียงโดยไม่บล็อกเซิร์ฟเวอร์หรือไคลเอนต์