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

คู่มือสำหรับผู้เริ่มต้นใช้งานโปรโตคอล Redis

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

RESP คืออะไร

RESP (RE โรค S การทำให้เป็นจริง P rotocol) คือชื่อของโปรโตคอลแบบข้อความที่ไคลเอ็นต์และเซิร์ฟเวอร์ Redis ใช้ในการสื่อสารผ่าน TCP ระหว่างกัน การสื่อสารทั้งหมดระหว่างเซิร์ฟเวอร์และไคลเอนต์ประกอบด้วยห้าประเภทพื้นฐาน:

  • สตริงอย่างง่าย ใช้สำหรับการตอบกลับของเซิร์ฟเวอร์ทั่วไป เช่น “ตกลง” (หลังจากเขียนคำสั่งสำเร็จ) หรือ “PONG” (การตอบกลับคำสั่ง PING ที่ประสบความสำเร็จ)
  • สตริงจำนวนมาก ส่งคืนสำหรับคำสั่งการอ่านค่าเดียวเกือบทั้งหมด เช่น GET, LPOP และ HGET สตริงจำนวนมากแตกต่างจากสตริงธรรมดาตรงที่สามารถมีอะไรก็ได้ ไม่ว่าจะเป็นการขึ้นบรรทัดใหม่ อักขระควบคุม หรือแม้แต่ validRESP ทั้งหมดนี้ไม่มีค่า Escape หรือเข้ารหัส
  • จำนวนเต็ม ถูกใช้เป็นการตอบกลับสำหรับคำสั่งการนับชนิดใดๆ เช่น STRLEN, HLEN หรือ BITCOUNT
  • อาร์เรย์ สามารถมีอ็อบเจ็กต์ RESP ได้จำนวนเท่าใดก็ได้ รวมถึงอาร์เรย์อื่นๆ ซึ่งใช้เพื่อส่งคำสั่งไปยังเซิร์ฟเวอร์ รวมถึงการตอบกลับที่ส่งคืนองค์ประกอบมากกว่าหนึ่งรายการ เช่น HGETALL, LRANGE หรือ MGET
  • ข้อผิดพลาด จะถูกส่งคืนเมื่อใดก็ตามที่ Redis พบข้อผิดพลาดขณะจัดการคำสั่งของคุณ เช่น เมื่อพยายามเรียกใช้คำสั่งกับคีย์ที่มีข้อมูลผิดประเภท

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

RESP มีหน้าตาเป็นอย่างไร

ออบเจ็กต์ RESP ทั้งหมดเริ่มต้นด้วยอักขระนำหน้าและลงท้ายด้วยตัวสิ้นสุดบรรทัด (ยกเว้นอาร์เรย์ซึ่งไม่มีตัวสิ้นสุดบรรทัดของตัวเอง) ตัวอย่างอย่างง่ายของวัตถุ RESP คือ OK การตอบสนองสตริงอย่างง่าย:

+OK\r\n

(RESP เป็นโปรโตคอลที่มนุษย์สามารถอ่านได้ แต่เพื่อความชัดเจน ฉันจะเขียนการขึ้นบรรทัดใหม่อย่างชัดเจน (\r\n ) ในตัวอย่าง RESP ทั้งหมด)

ในสตริงอย่างง่ายข้างต้น + เป็นคำนำหน้าสตริงอย่างง่าย OK เป็นเนื้อความของสตริงอย่างง่าย และ \r\n เป็นตัวสิ้นสุดบรรทัดที่ทำเครื่องหมายจุดสิ้นสุดของสตริงแบบง่ายนี้

หากต้องการอ่านสตริงแบบง่าย เราอ่านถึง \r\n . ถัดไป lineterminator ส่งคืนไบต์ก่อนหน้า (สูงสุด + ) เป็นข้อความตอบกลับที่ส่งคืน ใช้งานได้เพราะ RESP สตริงอย่างง่ายไม่สามารถรวมอักขระขึ้นบรรทัดใหม่ได้

ข้อผิดพลาดและจำนวนเต็มมีรูปแบบคล้ายกับสตริงธรรมดา แต่ใช้คำนำหน้าที่แตกต่างกัน ข้อผิดพลาดนำหน้าด้วย - :

-ERR unknown command 'GETT'\r\n

และจำนวนเต็มนำหน้าด้วย : :

:99\r\n

สตริงจำนวนมากมีลักษณะเฉพาะโดยมีสองส่วน ข้อกำหนดความยาวและร่างกาย:

$13\r\nHello, World!\r\n

$ เป็นคำนำหน้าสตริงจำนวนมาก 13 คือจำนวนไบต์ใน stringbody จริง แล้วตามด้วย \r\n สิ้นสุดข้อกำหนดความยาว Hello, World! คือเนื้อความสตริงขนาด 13 ไบต์ และจบลงด้วย \r\n (ซึ่งไม่ใช่ส่วนหนึ่งของเนื้อความของสตริง)

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

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

*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n

ในตัวอย่างข้างต้น เรามีอาร์เรย์ที่มีสตริงจำนวนมากสองสตริง (foo และbar ). แม้ว่าข้อกำหนดความยาวอาร์เรย์จะไม่อนุญาตให้เราข้ามไปข้างหน้าอย่างที่ทำได้เมื่ออ่านสตริงจำนวนมาก แต่ก็ทำให้ง่ายต่อการปรับใช้อาร์เรย์ในไคลเอนต์ของเรา เราอ่านขนาดอาร์เรย์ อ่านหลาย ๆ ออบเจ็กต์นั้น จากนั้นส่งคืนออบเจ็กต์ทั้งหมดในอาร์เรย์สุดท้าย

คำสั่ง Redis ทั้งหมดจะถูกส่งเป็นอาร์เรย์ของสตริงจำนวนมาก ตัวอย่างเช่น คำสั่ง "SET mykey 'my value'" จะถูกเขียนและส่งเป็น:

*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$8\r\nmy value\r\n

รายละเอียด RESP เพิ่มเติม

ความยาวนำหน้าที่ใช้ใน RESP ช่วยให้ Parsers ใช้งานได้โดยไม่จำเป็นต้องสร้างแบบจำลองสถานะที่ซับซ้อนหรือส่งผ่านข้อมูลหลายครั้ง ซึ่งช่วยให้สร้าง Parser ได้อย่างรวดเร็ว

มีรายละเอียดมากมายที่ฉันไม่ได้กล่าวถึงในที่นี้ เช่น null bulk strings และ null arrays สำหรับข้อมูลเพิ่มเติม เอกสารอย่างเป็นทางการ (ตามปกติ) มีหน้าเอกสารประกอบที่อ่านง่ายและครอบคลุมสำหรับ RESP

วิธีที่ดีในการทำความเข้าใจโปรโตคอลให้ดีขึ้นคือการลองใช้ simpleclient ด้วยตัวคุณเอง ดูคำแนะนำในการอ่านและเขียนโปรโตคอล Redis ใน Go next