เหตุผลหลักที่ฉันเห็นในวันนี้เป็นกรณีการใช้งานสำหรับ memcached บน Redis คือประสิทธิภาพของหน่วยความจำที่เหนือกว่าที่คุณควรจะได้รับจากการแคชส่วน HTML ธรรมดา (หรือแอปพลิเคชันที่คล้ายกัน) หากคุณต้องการจัดเก็บฟิลด์ต่างๆของวัตถุของคุณในคีย์ memcached ที่แตกต่างกันแฮช Redis จะช่วยให้หน่วยความจำมีประสิทธิภาพมากขึ้น แต่เมื่อคุณมีคู่คีย์ -> simple_string จำนวนมาก memcached จะสามารถให้รายการเพิ่มเติมแก่คุณต่อ เมกะไบต์
สิ่งอื่น ๆ ที่เป็นจุดดีเกี่ยวกับ memcached:
- มันเป็นโค้ดที่ง่ายมากดังนั้นหากคุณต้องการเพียงแค่ฟังก์ชันที่มีให้มันก็เป็นทางเลือกที่สมเหตุสมผล แต่ฉันไม่เคยใช้มันในการผลิต
- มันเป็นแบบมัลติเธรดดังนั้นหากคุณต้องการปรับขนาดในการตั้งค่ากล่องเดียวมันเป็นสิ่งที่ดีและคุณต้องพูดคุยกับอินสแตนซ์เดียว
ฉันเชื่อว่า Redis ในฐานะแคชมีความหมายมากขึ้นเรื่อย ๆ เมื่อผู้คนเปลี่ยนไปใช้การแคชอัจฉริยะหรือเมื่อพวกเขาพยายามรักษาโครงสร้างของข้อมูลแคชผ่านโครงสร้างข้อมูล Redis
การเปรียบเทียบระหว่าง Redis LRU และ memcached LRU
ทั้ง memcached และ Redis ไม่ได้ทำการขับไล่ LRU จริง แต่เป็นเพียงการประมาณเท่านั้น
การขับไล่ Memcache เป็นคลาสตามขนาดและขึ้นอยู่กับรายละเอียดการใช้งานของตัวจัดสรรพื้น ตัวอย่างเช่นหากคุณต้องการเพิ่มไอเท็มที่เหมาะกับคลาสขนาดที่กำหนด memcached จะพยายามลบไอเท็มที่หมดอายุ / ไม่ได้ใช้งานล่าสุดในคลาสนั้นแทนเพื่อพยายามทั่วโลกเพื่อทำความเข้าใจว่าอ็อบเจ็กต์คืออะไรโดยไม่คำนึงถึง ขนาดซึ่งเป็นตัวเลือกที่ดีที่สุด
Redis พยายามเลือกวัตถุที่ดีเป็นตัวเลือกในการขับไล่เมื่อถึงmaxmemory
ขีด จำกัด โดยดูที่วัตถุทั้งหมดโดยไม่คำนึงถึงระดับขนาด แต่สามารถจัดหาวัตถุที่ดีโดยประมาณเท่านั้นไม่ใช่วัตถุที่ดีที่สุดที่มีการไม่ได้ใช้งานมากขึ้น เวลา.
วิธีที่ Redis ทำได้คือการสุ่มตัวอย่างวัตถุสองสามชิ้นเลือกวัตถุที่ไม่มีการใช้งาน (ไม่ได้เข้าถึง) เป็นเวลานานที่สุด เนื่องจาก Redis 3.0 (ปัจจุบันเป็นรุ่นเบต้า) อัลกอริทึมได้รับการปรับปรุงและยังใช้กลุ่มผู้สมัครที่ดีในการขับไล่ดังนั้นการประมาณจึงได้รับการปรับปรุง ในเอกสาร Redis คุณสามารถหาคำอธิบายและกราฟรายละเอียดเกี่ยวกับวิธีการทำงาน
เหตุใด memcached จึงมีหน่วยความจำที่ดีกว่า Redis สำหรับสตริงธรรมดา -> แผนที่สตริง
Redis เป็นซอฟต์แวร์ที่ซับซ้อนกว่าดังนั้นค่าใน Redis จึงถูกจัดเก็บในลักษณะที่คล้ายกับอ็อบเจ็กต์ในภาษาโปรแกรมระดับสูงมากขึ้น: มีประเภทที่เกี่ยวข้องการเข้ารหัสการนับการอ้างอิงสำหรับการจัดการหน่วยความจำ สิ่งนี้ทำให้โครงสร้างภายในของ Redis ดีและสามารถจัดการได้ แต่มีค่าใช้จ่ายเมื่อเทียบกับ memcached ซึ่งเกี่ยวข้องกับสตริงเท่านั้น
เมื่อ Redis เริ่มมีประสิทธิภาพหน่วยความจำมากขึ้น
Redis สามารถจัดเก็บประเภทข้อมูลรวมขนาดเล็กด้วยวิธีการประหยัดหน่วยความจำพิเศษ ตัวอย่างเช่น Redis Hash ขนาดเล็กที่แสดงถึงวัตถุจะถูกเก็บไว้ภายในไม่ได้อยู่ในตารางแฮช แต่เป็นหยดเฉพาะไบนารี ดังนั้นการตั้งค่าหลายช่องต่อออบเจ็กต์ลงในแฮชจึงมีประสิทธิภาพมากกว่าการจัดเก็บคีย์ที่แยกจาก N ไว้ใน memcached
จริงๆแล้วคุณสามารถจัดเก็บวัตถุลงใน memcached เป็นหยด JSON เดียว (หรือที่เข้ารหัสไบนารี) แต่ตรงกันข้ามกับ Redis สิ่งนี้จะไม่อนุญาตให้คุณดึงข้อมูลหรืออัปเดตช่องอิสระ
ข้อได้เปรียบของ Redis ในบริบทของการแคชอัจฉริยะ
เนื่องจากโครงสร้างข้อมูล Redis รูปแบบปกติที่ใช้กับ memcached ในการทำลายวัตถุเมื่อแคชไม่ถูกต้องเพื่อสร้างใหม่จากฐานข้อมูลในภายหลังจึงเป็นวิธีดั้งเดิมในการใช้ Redis
ตัวอย่างเช่นสมมติว่าคุณต้องแคช N ข่าวล่าสุดที่โพสต์ลงใน Hacker News เพื่อเติมข้อมูลในส่วน "ใหม่ล่าสุด" ของไซต์ สิ่งที่คุณทำกับ Redis คือการนำรายการ (ต่อยอดไปที่รายการ M) พร้อมกับแทรกข่าวสารล่าสุด ถ้าคุณใช้ที่เก็บอื่นสำหรับข้อมูลของคุณและ Redis เป็นแคชสิ่งที่คุณทำคือเติมข้อมูลทั้งมุมมอง (Redis และ DB) เมื่อมีการโพสต์รายการใหม่ ไม่มีการทำให้แคชไม่ถูกต้อง
อย่างไรก็ตามแอปพลิเคชันสามารถมีตรรกะได้เสมอดังนั้นหากพบว่ารายการ Redis ว่างเปล่าตัวอย่างเช่นหลังจากการเริ่มต้นมุมมองเริ่มต้นสามารถสร้างขึ้นใหม่ได้จากฐานข้อมูล
ด้วยการใช้การแคชอัจฉริยะทำให้สามารถทำการแคชด้วย Redis ได้อย่างมีประสิทธิภาพมากกว่าเมื่อเทียบกับ memcached แต่ไม่ใช่ปัญหาทั้งหมดที่เหมาะกับรูปแบบนี้ ตัวอย่างเช่นการแคชแฟรกเมนต์ HTML อาจไม่ได้รับประโยชน์จากเทคนิคนี้