ทำไม Redis ถึงชนะ Memcached สำหรับการแคช

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

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

Redis กับ Memcached สำหรับการแคช

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

ทั้ง Memcached และ Redis เป็นโครงการโอเพ่นซอร์สที่เป็นผู้ใหญ่และได้รับความนิยมอย่างมาก Memcached ได้รับการพัฒนาโดย Brad Fitzpatrick ในปี 2546 สำหรับเว็บไซต์ LiveJournal ตั้งแต่นั้นมา Memcached ได้รับการเขียนใหม่ในภาษา C (การใช้งานดั้งเดิมอยู่ใน Perl) และวางไว้ในโดเมนสาธารณะซึ่งมันได้กลายเป็นรากฐานที่สำคัญของเว็บแอปพลิเคชันสมัยใหม่ การพัฒนา Memcached ในปัจจุบันมุ่งเน้นไปที่ความเสถียรและการปรับให้เหมาะสมมากกว่าการเพิ่มคุณสมบัติใหม่ ๆ

Redis สร้างขึ้นโดย Salvatore Sanfilippo ในปี 2009 และ Sanfilippo ยังคงเป็นผู้นำในการพัฒนาโครงการในปัจจุบัน บางครั้ง Redis ถูกอธิบายว่าเป็น“ Memcached on เตียรอยด์” ซึ่งแทบจะไม่น่าแปลกใจเมื่อพิจารณาว่าส่วนต่างๆของ Redis ถูกสร้างขึ้นเพื่อตอบสนองต่อบทเรียนที่ได้รับจากการใช้ Memcached Redis มีคุณสมบัติมากกว่า Memcached ดังนั้นจึงมีประสิทธิภาพและยืดหยุ่นมากกว่า

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

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

ควรใช้ Memcached เมื่อใด

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

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

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

เมื่อใดควรใช้ Redis

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

ความเหนือกว่าของ Redis เห็นได้ชัดในแทบทุกด้านของการจัดการแคช แคชใช้กลไกที่เรียกว่าการขับไล่ข้อมูลเพื่อให้มีที่ว่างสำหรับข้อมูลใหม่โดยการลบข้อมูลเก่าออกจากหน่วยความจำ กลไกการขับไล่ข้อมูลของ Memcached ใช้อัลกอริธึมที่ใช้น้อยที่สุดและค่อนข้างขับไล่ข้อมูลที่มีขนาดใกล้เคียงกับข้อมูลใหม่โดยพลการ

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

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

Redis สำหรับการคงอยู่ของข้อมูล

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

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

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

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

Redis การจำลองข้อมูลในหน่วยความจำ 

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

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

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

Redis สำหรับการวิเคราะห์ข้อมูล

สถานการณ์การวิเคราะห์สามสถานการณ์เกิดขึ้นในทันที ในสถานการณ์แรกเมื่อใช้บางอย่างเช่น Apache Spark เพื่อประมวลผลชุดข้อมูลขนาดใหญ่ซ้ำ ๆ คุณสามารถใช้ Redis เป็นเลเยอร์การให้บริการสำหรับข้อมูลที่ Spark คำนวณไว้ก่อนหน้านี้ ในสถานการณ์ที่สองการใช้ Redis เป็นที่เก็บข้อมูลแบบกระจายในหน่วยความจำที่ใช้ร่วมกันของคุณสามารถเร่งความเร็วในการประมวลผลของ Spark ได้โดยปัจจัย 45 ถึง 100 ในที่สุดสถานการณ์ที่พบบ่อยเกินไปคือสถานการณ์ที่รายงานและการวิเคราะห์จำเป็นต้องปรับแต่งได้ ผู้ใช้ แต่การดึงข้อมูลจากที่เก็บข้อมูลแบทช์โดยเนื้อแท้ (เช่น Hadoop หรือ RDBMS) ใช้เวลานานเกินไป ในกรณีนี้การจัดเก็บโครงสร้างข้อมูลในหน่วยความจำเช่น Redis เป็นวิธีเดียวที่ใช้ได้จริงในการรับเพจย่อยมิลลิวินาทีและเวลาตอบสนอง

เมื่อใช้ชุดข้อมูลการดำเนินงานขนาดใหญ่มากหรือปริมาณงานการวิเคราะห์การรันทุกอย่างในหน่วยความจำอาจไม่คุ้มค่า เพื่อให้ได้ประสิทธิภาพการทำงานย่อยในระดับมิลลิวินาทีด้วยต้นทุนที่ต่ำลง Redis Labs ได้สร้าง Redis เวอร์ชันที่ทำงานบน RAM และแฟลชร่วมกันพร้อมตัวเลือกในการกำหนดค่าอัตราส่วน RAM-to-flash แม้ว่าวิธีนี้จะเปิดช่องทางใหม่ ๆ ในการเร่งการประมวลผลปริมาณงาน แต่ก็ยังช่วยให้นักพัฒนามีตัวเลือกในการเรียกใช้ "แคชบนแฟลช"

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

---

Itamar Haber (@itamarhaber) เป็นหัวหน้าผู้สนับสนุนนักพัฒนาที่ Redis Labs ซึ่งให้บริการ Memcached และ Redis เป็นบริการคลาวด์ที่มีการจัดการเต็มรูปแบบสำหรับนักพัฒนา ประสบการณ์ที่หลากหลายของเขารวมถึงการพัฒนาผลิตภัณฑ์ซอฟต์แวร์และการจัดการและบทบาทความเป็นผู้นำที่ Xeround, Etagon, Amicada และ MNS Ltd. Itamar สำเร็จการศึกษาระดับปริญญาโทด้านการบริหารธุรกิจจากโครงการ Kellogg-Recanati ร่วมกันโดย Northwestern และ Tel-Aviv Universities รวมถึงปริญญาตรี วิทยาศาสตร์สาขาวิทยาการคอมพิวเตอร์

New Tech Forum เป็นสถานที่สำหรับสำรวจและพูดคุยเกี่ยวกับเทคโนโลยีสำหรับองค์กรที่เกิดขึ้นใหม่ในเชิงลึกและเชิงกว้างที่ไม่เคยมีมาก่อน การเลือกเป็นเรื่องส่วนตัวขึ้นอยู่กับการเลือกใช้เทคโนโลยีที่เราเชื่อว่ามีความสำคัญและเป็นที่สนใจของผู้อ่านมากที่สุด ไม่ยอมรับหลักประกันทางการตลาดสำหรับการตีพิมพ์และขอสงวนสิทธิ์ในการแก้ไขเนื้อหาที่มีส่วนร่วมทั้งหมด ส่งคำถามทั้งหมดไปที่ [email protected]