redis database ที่ทำงานได้รวดเร็ว

redis database ที่ทำงานได้รวดเร็ว

redis คืออะไร

redis คือชื่อ database แบบหนึ่ง เหมือนกับที่เราเคยได้ยิน MySQL, SQLite, MSSQL, Oracle, Mongo DB นี่แหล่ะครับ แต่ว่า redis เป็นประเภทหนึ่ง ของ NoSQL ก็คือ database ที่ทำงานโดยไม่อิงตามความสัมพันธ์ของเนื้อหา เช่น เราเก็บ profile ของคนนึงไว้ ซึ่งมีชื่อ นามสกุล ที่อยู่ เบอร์โทร อีเมล ใน database แบบ relational เราจะสามารถหาความเชื่อมโยงของ คนที่ใช้นามสกุลเดียวกันได้ หรือว่า อยู่ในจังหวัดเดียวกันได้ แต่ NoSQL จะทำสิ่งเหล่านั้นไม่ได้ด้วยตัวมันเอง แต่ว่า ถ้าเราปรับรูปแบบการเก็บข้อมูลให้เป็น pattern ที่เจาะจงต่อการใช้ได้แล้ว เราก็จะเอาข้อมูลเหล่านั้นออกมาได้เหมือนกัน (คือ ถ้าเก็บไปแบบทื่อๆ เราจะเอามันออกมาในรูปแบบที่ประหลาดๆไม่ได้) และที่สำคัญของ NoSQL ก็คือ มันทำงานได้เร็วกว่า SQL มากๆๆๆๆๆๆ ย้ำว่ามากกกกกกๆๆๆ เพราะว่า นี่แหล่ะ คือจุดเด่นของ database แบบ NO SQL ที่เข้ามาชดเชย database แบบ relation แบบเดิม

เพราะคนที่ทำงานกับระบบใหญ่ๆ มานานๆ เยอะๆ จะรู้เลยว่า ระบบการทำงานในปัจจุบัน มีคอขวด อยู่ที่ระบบ database นั่นเอง (คือ อ่านข้อมูลจาก database ออกมา หรือ เขียนข้อมูลกลับเข้า database ไม่ทันต่อการใช้งานที่มีปริมาณเยอะมากๆ) ดังนั้น จึงต้องมีการพัฒนา database รูปแบบใหม่ๆที่ทำงานได้เร็วกว่าเดิมมากๆนั่นเอง

ก็เหมือนกับว่า เราได้อย่าง เราก็ต้องเสียบางอย่างไป คนที่เลือกใช้ NoSQL เพราะว่ามันทำงานได้รวดเร็ว แต่เค้าก็จะทำงานกับข้อมูลที่เก็บอยู่ลำบากขึ้นนิดนึง เพราะคนใช้ NoSQL ต้องวาง algorithm การเก็บข้อมูล และการเรียกข้อมูล(ขั้นตอนออกแบบ) มากกว่าคนใช้งาน database แบบ relation มาก คือต้องคิดเยอะๆ ไม่งั้นแล้วก็จะเอาข้อมูลที่เก็บไว้ ออกมาใช้ได้ลำบาก หรือกลายเป็นขยะไป

แต่ว่า หลายคนก็เอามาใช้ประโยชน์ ให้ตรงวัตถุประสงค์ เช่น เอามาทำเป็น cache ของ database แบบ relation อีกทีนึง เช่น เราต้อง เรียกข้อมูลที่มีความซับซ้อนมากๆ จาก MySQL ออกมา ครั้งนึงอาจจำทำงาน 500ms หากเราเรียก 1 แสนครั้ง MySQL อาจจะทำงานไม่ทันก็ได้ เพราะต้องเข้าคิวยาวมากกก แต่หากเราเรียกจาก MySQL เพียงครั้งเดียว แล้วเก็บขึ้นไปไว้ใน database NoSQL แล้ว หลังจากนั้นเราก็ไม่ต้องใช้ MySQL อีกเลย เพราะไปเรียกจาก NoSQL เพียงอย่างเดียว เท่านี้ เว็บก็รองรับการใช้งานเพิ่มขึ้นอีกมากไม่รู้กี่เท่าตัว เพราะเค้าบอกว่า NoSQL จะทำงานได้เร็วกว่า SQL แบบเดิม หลายเท่าตัวเลย (ขึ้นอยู่กับ database ที่เอามาเปรียบเทียบกัน)

ย้อนกลับมาที่ redis (ออกนอกเรื่องไปไกลมาก) ที่เป็น database แบบ NoSQL นั้น ถ้าเรามองมันแบบผิวเผิน เค้าบอกว่า มันเป็น key value database เลย ซึ่ง key value database เนี่ย ถ้านึกภาพง่ายๆ มันคือการสร้างตัวแปรนั่นล่ะครับ ก็คือ ตั้งชื่อ กำหนด จบครับ (อย่าลืม ว่า ตัวแปร เก็บค่าเอาไว้บนแรม) ทำให้มันทำงานได้เร็วมากๆ แต่ว่า มันไม่ได้ทำงานเป็นตัวแปรอย่างเดียว เพราะว่ามันคือ database นะครับ ดังนั้นมันเก็บค่าได้ แม้ว่าเครื่อง server ที่ทำงานไฟดับ ค่ามันก็จะยังคงอยู่ไม่ได้หายไปไหนแต่อย่างใดเลย แต่ว่าข้อเสีย ก็คือ ถ้าเราไม่รู้ชื่อตัวแปร เราก็เรียกค่ามันออกมาไม่ได้ หรือว่า เราไม่สามารถ search ชื่อตัวแปรได้นั่นเอง (จริงอยู่ที่หลังๆ redis มี function ในการ search จาก pattern ของ ชื่อตัวแปร แต่เค้าไม่แนะนำให้ใช้ เพราะมันจะเสียความเร็วไปนั่นเอง)

redis ทำงานอย่างไร

redis มีการเก็บค่าแบบ key value ก็คือ การตั้งชื่อ (key) และการกำหนดค่าให้มัน(value) ซึ่งจะเป็นแบบ binary safe คือ ไม่ว่าเราจะใส่ value อะไรเข้าไปยังไงหน้าตาแบบไหน ตอนออกมาก็จะมีหน้าตาเหมือนเดิมเลย โดยใส่หนังลงไปทั้งเรื่องก็ยังได้ครับ (แต่ redis ไม่แนะนำนะ และมีข้อจำกัด 1 key เก็บ value ได้สูงสุดที่ 512MB เพราะยิ่ง value ที่มีขนาดใหญ่ redis ก็จะยิ่งทำงานช้าลงมาก) 

แต่ว่า redis ไม่ได้มีการเก็บค่าทื่อๆ แบบที่เล่าให้ฟังแบบเดียว ยังมีอีกหลายแบบ ที่กำลังพัฒนาออกมาเรื่อยๆ ทำให้เราสั่งให้ redis ทำงานตามเงื่อนไขที่เราต้องการได้มากขึ้น เช่น การใช้ list ในการเรียงลำดับค่า ที่ลำดับ มีความสำคัญ เช่นการ post ข้อความที่มาก่อนหรือหลัง หรือการเข้าคิว มาก่อน มาหลัง (ถ้าแบบ SQL ก็คือ ORDER BY) โดยไม่เสียเวลาในการ sort เลย หรือว่า การใช้ set ในการเก็บ member เช่น เอาไว้เก็บ ว่า เรามีเพื่อนเป็น id อะไรบ้าง ใน key เพียง key เดียวเท่านั้น(ถ้า SQL เราก็ต้องเก็บ primary key จับคู่กับ foreign key ให้ครบเพื่อนทุกคน) และยังเอามาทำงานต่อได้ เช่น หาว่า เพื่อนเรา เป็นเพื่อนของเพื่อนนาย A กี่คน หรือว่า Z เป็นเพื่อนของเรากับเพื่อนของนาย A หรือเปล่า (SQL ก็ใช้ WHERE ผสม JOIN) หากเราเอางานแบบนี้ไปทำใน SQL database ที่มีจำนวนข้อมูลเป็นล้านๆล่ะก็ รับรองครับ แค่สองคำสั่งนี้ก็แทบไม่ต้องทำอะไรต่อแล้ว

redis เร็วกว่า SQL database แค่ไหน 

ถ้าได้ลองค้น google ดูจากผลการทดสอบ ที่หลายคนทำเอาไว้ จะพบว่า redis ทำงานได้เร็วกว่า MySQL ประมาณ 3 เท่าตัวเป็นอย่างน้อย คือ ถ้า MySQL อ่านได้ 10 record แต่ redis อ่านได้ 30 record นั่นเอง ถือว่าเป็นตัวเลขที่ไม่แย่เลยใช่มั้ยครับ แต่ต้องไม่ลืมอย่างหนึ่ง คือ redis ทำงานหลักๆบน ram ซึ่งเป็นอุปกรณ์ความจุ ที่มีราคาแพงที่ีสุดแล้ว (CPU ไม่ได้เอาไว้เก็บข้อมูลนะครับ จึงไม่เอามาเทียบ) ปัจจุบัน เรามี SSD ที่ถือว่าเป็นอุปกรณ์เก็บข้อมูลที่มีราคาแพงกว่า HDD มากมาย เช่น ราคาวันที่เขียนบทความนี้ SSD ความจุ 128GB ราคา 4,500 บาท แต่ว่า RAM ขนาด 16GB ราคา 5300 บาท จะเห็นว่า ราคาต่างกันแบบสุดๆ ดังนั้นแล้ว คิดก่อน ใช้ทุกครั้งก็จะดีมาก (แต่จะว่าไป การเก็บข้อมูลบน ram ขนาด 1 GB นี่ก็ถือว่ามหาศาลมากๆแล้วนะครับ)

เว็บไหนใช้ redis บ้าง 

ก็ลองอ่านกันดูครับ เยอะเลย http://redis.io/topics/whos-using-redis  อันนี้ไม่นับเว็บย่อยๆอื่นๆนะครับ

เมื่อไรจะเริ่มใช้ redis

คำถามนี้ ต้องถามตัวเองแล้วล่ะครับ ว่าที่ทำงานทุกวันนี้ เว็บเริ่มช้าหรือยัง ถ้าเริ่มช้าแล้ว เคยลองเข้าไปตรวจวิเคราะห์มั้ย ว่ามันช้าเพราะอะไร database หรือ script ที่เขียน เพราะว่า การทำงานที่ได้ผลลัพท์แบบเดียวกัน บนข้อมูลเดียวกัน ให้คน 10 คน เขียน ก็ใช้ความเร็วและทรัพยากรที่ไม่เท่ากันนะครับ บางเว็บเปิด พันคนแล้วล่ม แก้ไปแก้มาให้ถูกต้อง เปิด หมื่นคนก็ยังไม่ล่ม มีเยอะแยะไปนะครับ ทั้งนี้ ขึ้นอยู่กับการสังเกตุ การตรวจวิเคราะห์ให้ถูกต้อง ตรงจุด ตั้งสมมุติฐานขึ้นมาก่อน ว่า ช้าที่จุดนี้จริงมั้ย อาการแบบไหนที่บอกว่า จุดนี้คือช้า จากนั้นลองทดสอบ ถ้าเจอจริงตามที่ตั้งสมมุติฐาน ก็แก้ไปครับ และวัดผลอีกครั้ง ค่อยๆทำไปทีละจุด เดี๋ยวก็เร็วขึ้น

เพราะว่าการเปลี่ยนมาใช้งาน redis ไม่ได้ง่ายแค่ วันพรุ่งนี้ติดตั้ง แล้วจะใช้งานได้เลย เพราะคนใช้เอง ต้องเปลี่ยนวิธีการ เก็บ การเรียกใช้ข้อมูล และต้องออกแบบให้ถูกต้อง มันถึงจะเร็วจริงครับ

Create: Modify : 2013-07-21 14:22:17 Read : 9280 URL :