หาก redis เป็นส่วนหนึ่งของสแต็กแล้วเหตุใด Memcached จึงยังคงใช้ร่วมกับ Redis


85

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

การอ้างอิงถึงคำตอบเก่า ๆ ซึ่งเปรียบเทียบ Redis และ Memcache ซึ่งบางคำนิยมให้ Redis แทนที่ Memcache (หากมีอยู่แล้วในสแต็ก)

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

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

อัปเดต:

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

สถานการณ์ตัวอย่างบางส่วน:

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

คำตอบ:


122

เหตุผลหลักที่ฉันเห็นในวันนี้เป็นกรณีการใช้งานสำหรับ 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 อาจไม่ได้รับประโยชน์จากเทคนิคนี้


ขอบคุณผู้สร้าง Antirez แต่ ** เหตุใด Redis memory footprint สำหรับสตริงธรรมดาจึงมีมากกว่า memcached? ** กำลังอัดเป็นปัจจัยหรือไม่? หรือ Redis เก็บข้อมูลพิเศษอื่น ๆ เมื่อใช้ SET เพื่อจัดเก็บสตริงธรรมดา จะดีมากถ้าคุณสามารถรวมข้อมูลนี้ไว้ในคำตอบ
DhruvPathak

3
ฉันพยายามปรับปรุงการตอบกลับ ขอบคุณสำหรับการตอบกลับ
antirez

3
อีกแง่มุมหนึ่งของ "ข่าวกรอง" ที่กล่าวถึงข้างต้นหรือการใช้ประโยชน์จากชนิดข้อมูลและตรรกะฝั่งเซิร์ฟเวอร์ของ Redis ผ่านการดำเนินการและ / หรือสคริปต์คือคุณประหยัดทั้งความซับซ้อนของแอปพลิเคชันและเครือข่าย (ตามที่ @antirez กล่าวไว้ที่antirez com / news / 73และ Yiftach ที่redislabs.com/blog/the-proven-redis-performance )
Itamar Haber

1
Antirez ขอบคุณสำหรับคำตอบ อีกเหตุผลหนึ่งอาจเป็นเพราะ memcached เร็วขึ้นเล็กน้อย นอกจากนี้ยังเป็นซอฟต์แวร์รุ่นเก่าและเฟรมเวิร์กจำนวนมากสนับสนุนเป็นค่าเริ่มต้น
Nick

3
คำตอบที่ยอดเยี่ยมต้องรักว่าพ่อของ Redis ทุ่มเทให้กับชุมชนเพียงใด
Mahn

13

นิสัยพังยาก :)

อย่างจริงจังมีสองเหตุผลหลัก - สำหรับความเข้าใจของฉัน - ทำไมยังคงใช้ Memcached:

  1. Legacy - มีนักพัฒนาที่คุ้นเคยและคุ้นเคยกับ Memcached รวมถึงแอปพลิเคชันที่รองรับ นอกจากนี้ยังหมายความว่าเป็นเทคโนโลยีที่สมบูรณ์และผ่านการทดสอบมาเป็นอย่างดี
  2. การปรับมาตราส่วน - Memcached มาตรฐานสามารถปรับขนาดได้อย่างง่ายดายในแนวนอนในขณะที่ Redis (จนถึงและไม่รวม v3 ที่จะเปิดตัวเร็ว ๆ นี้) ต้องการการทำงานมากขึ้นในตอนท้าย (เช่นการแบ่งส่วนข้อมูล)

อย่างไรก็ตาม:

  1. เรื่อง มรดก - รับ Redis' ทนทาน (โครงสร้างข้อมูลคำสั่งติดตา ... ) มันถูกพัฒนาอย่างแข็งขันและลูกค้าในภาษาไปได้ทุก - การใช้งานใหม่จะมักจะพัฒนากับมัน
  2. Re scaling - นอกจาก v3 ที่กำลังจะมาถึงแล้วยังมีโซลูชันที่ช่วยให้การปรับขนาดง่ายขึ้นมาก ตัวอย่างเช่นRedis Cloudนำเสนอการปรับขนาดที่ราบรื่นโดยไม่มีข้อมูลสูญหายหรือบริการหยุดชะงัก อีกวิธีที่นิยมในการปรับ / sharding Redis เป็นtwemproxy

1
หมายเหตุ: ตามที่ได้รับการยืนยันจากผู้ดูแลปัจจุบันบน Twitter Memcached ยังคงได้รับการพัฒนา / บำรุงรักษาอย่างต่อเนื่อง ฉันเดาว่าความจริงที่ว่ามันไม่ได้เพิ่มสิ่งใหม่ ๆ มักจะเกิดจากความครบกำหนดของโครงการและความไม่เต็มใจที่จะเพิ่มสิ่งใหม่ ๆ ดังนั้นการพัฒนาใหม่จึงมุ่งเน้นไปที่การเพิ่มประสิทธิภาพ / การแก้ไข
antirez

1
TIL ที่ Memcached ยังมีชีวิตอยู่และเตะ - แก้ไขคำตอบของฉัน / ty antirez & dormando
Itamar Haber

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

1
RedisLabs นั้นยอดเยี่ยมมาก เป็นเทคโนโลยีหลักที่อยู่เบื้องหลัง Userify Cloud
fatal_error

1
ฉันยังสงสัยอย่างมากเกี่ยวกับการใช้งานใด ๆ ที่ไม่ใช่แบบมัลติเธรดและตามห่วงเหตุการณ์ ... ตกลงตอนนี้นักแสดงขอโทษทุกคนอยู่ที่ไหนฉันได้เตรียมอาหารเย็นไว้แล้ว ตอนนี้ redis ทำได้แล้วและฉันจะเป็นมือโปรมากขึ้นจากฝั่งระบบ ณ จุดนี้แม้ว่ากลุ่ม dev จะมีความสามารถในการแคชอย่างผิดปกติ memcached เป็นการใช้งานที่ง่ายและมีประสิทธิภาพมากขึ้น .... คุณสมบัติต่างๆไม่เคยฟรีอย่าให้ผู้ขอโทษบอกว่าเป็นเช่นนั้นหรือค่าใช้จ่ายของคุณไม่มีนัยสำคัญ
JM Becker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.