ใช้ Redis แก้ปัญหาตอนที่ 1

เนื่องจากผมได้จับ Redis แบบจริงๆจังๆเป็นครั้งแรก โดยผมศึกษาจากความเป็นไปได้มาดูได้อย่างชัดเจนคือ Redis แก้ปัญหาเรื่อง Queue , Stack ผมได้เป็นอย่างดีกว่า Relational Database เป็นไหนๆ เพราะเรื่องเหล่านี้ครับ

  • ปัญหา SELECT และ INSERT ซึ่งเป็นไปได้ว่าถ้ามี Process มากกว่า 1 ที่ทำงานเหมือนกันตอนจังหวะเดียวกัน ดันจะ Save ID เดียวกันแล้วผ่านขั้นตอน SELECT มาแล้วรอ Insert (ปัญหาอาจจะมาจากการ Locked ของ Database) ทำให้มี ID อันเดียวกันซ่ำซ้อนอยู่ในระบบ ซึ่งใน Relational Database จะแก้ด้วยวิธีใส่ Unique Index แต่ Redis ทำได้ดีกว่ามาก เพราะ LPUSH LPOP ในเครื่อง R210 ของผมนั้นได้ 110,000 Req/s ซึ่งเร็วกว่า MySQL ประมาณ 50 กว่าเท่าได้
  • การเพิ่มข้อมูลไปใน Queue โดย Value จะต้องไม่ซ้ำกับอันเดิม Redis นั้นมี SADD ซึ่งเวลาเพิ่มไปแล้วมันจะ Return true กับ false มานั้นเพียงพอให้เรารู้ได้แล้วว่า ที่เราใส่ข้อมูลไปใน Queue นั้นสำเร็จไหมเวลาจะเอาข้อมูลก็ SPOP ออกมา ข้อดีที่ชัดเจนเลยคือถ้าเป็น MySQL เวลาเรา Pop ข้อมูลพร้อมกัน 30 Process ที่เกิดมาพร้อมกัน เรามีโอกาศได้ข้อมูลที่ SPOP ซ้ำมาจำนวนไม่น้อยทีเดียว แต่ถ้าเป็น SPOP นั้นคือจะลบแล้วเอาข้อมูลออกมา ทำให้ไม่มีการซ้ำของข้อมูลเวลาเอาออกมาซึ่ง ทำให้ทำงานไม่ซ้ำซ้อนกันครับ
  • เวลาทำ Config ระบบซึ่งเก็บเป็นแค่ Key Value Store ธรรมดา การใช้ MySQL ก็ไม่ใช่ทำไม่ได้ แต่ความเร็วอาจจะเป็นปัญหาเมื่อมีการเรียกใช้เป็นจำนวนมากๆ กับการหาค่า Config ของ Key ตัวหนึ่งใน Database ซึ่งประมาณ 2500 req/s แต่กับ Redis 115,000 req/s คนละเรื่อง !!
  • ถังพักข้อมูล พูดเฉยๆคงไม่เห็นภาพต้องอธิบาย Scenario เช่น ผมต้องการไปเก็บข้อมูลจาก Facebook API แต่ทว่าปัญหาไม่ได้อยู่ที่การ Request ไปหา Facebook แต่ปัญาหาคือการ Save ลงฐานข้อมูลช้าทำให้อยู่ใน Waiting State นานเกินไปแทนที่จะไป Request มาเก็บข้อมูลต่อได้ ก็เลยค้างแหง่กอยู่แบบนี้ โดยถ้าเอาถังพักเป็น Redis ก็บอกได้คำเดิมคือ 2500 req/s กับ 115,000 req/s ต่างกันเยอะขนาดนี้มีผลต่อการพักข้อมูลแน่นอนครับยิ่งเร็ว Process ยิ่งปล่อยเร็วแล้วไป Request เอาข้อมูลมาเพิ่มได้เร็วขึ้น ดังนั้นกรณีนี้ยิ่งเร็วยิ่งดี ! ดังนั้น Redis เลยเป็นทางเลือกที่เหมาะสม

จริงๆแล้ว Redis ยังแก้ปัญหาได้อีกมากมายแต่อันนี้คืออันที่ผมเอามาใช้จริงและได้ผลดีครับ เลยเอามาบอกเป็น idea เผื่อมีคนอยากลองใช้ โดยตัว Client ผมใช้เป็น PHP Redis ตัวนี้นะครับซึ่งเขียนด้วยภาษา C ครับ https://github.com/nicolasff/phpredis ส่วนถ้าผมได้ใช้อะไรเพิ่มเกี่ยวกับ Redis เดียวผมจะมาเล่าให้ฟังต่อนะครับ

One thought on “ใช้ Redis แก้ปัญหาตอนที่ 1

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>