คำตอบทั้งหมด (ในขณะที่เขียนนี้) ถือว่า Redis, MongoDB แต่ละตัวและบางทีฐานข้อมูลเชิงสัมพันธ์แบบอิง SQL เป็นหลักเป็นเครื่องมือเดียวกัน: "เก็บข้อมูล" พวกเขาไม่ได้พิจารณาตัวแบบข้อมูลเลย
MongoDB: ข้อมูลที่ซับซ้อน
MongoDB เป็นที่เก็บเอกสาร เพื่อเปรียบเทียบกับฐานข้อมูลเชิงสัมพันธ์ที่ขับเคลื่อนด้วย SQL: ฐานข้อมูลเชิงสัมพันธ์ทำให้ไฟล์ CSV ที่จัดทำดัชนีง่ายขึ้นแต่ละไฟล์เป็นตาราง ที่เก็บเอกสารทำให้การจัดทำดัชนีไฟล์ JSON ง่ายขึ้นแต่ละไฟล์เป็นเอกสารโดยมีหลายไฟล์รวมกัน
ไฟล์ JSON นั้นมีโครงสร้างคล้ายกับไฟล์ XML และ YAML และพจนานุกรมเช่นเดียวกับใน Python ดังนั้นให้คิดถึงข้อมูลของคุณในลำดับชั้นดังกล่าว เมื่อจัดทำดัชนีโครงสร้างคือคีย์: เอกสารประกอบด้วยคีย์ที่มีชื่อซึ่งมีทั้งเอกสารเพิ่มเติมอาร์เรย์หรือค่าสเกลาร์ พิจารณาเอกสารด้านล่าง
{
_id: 0x194f38dc491a,
Name: "John Smith",
PhoneNumber:
Home: "555 999-1234",
Work: "555 999-9876",
Mobile: "555 634-5789"
Accounts:
- "379-1111"
- "379-2574"
- "414-6731"
}
เอกสารดังกล่าวข้างต้นมีคีย์ซึ่งมีค่าPhoneNumber.Mobile 555 634-5789คุณสามารถค้นหาเอกสารที่สำคัญPhoneNumber.Mobileมีค่าบางอย่าง; พวกเขากำลังจัดทำดัชนี
นอกจากนี้ยังมีอาร์เรย์Accountsที่เก็บดัชนีหลายรายการ มันเป็นไปได้ที่จะสอบถามสำหรับเอกสารที่Accountsมีตรงส่วนย่อยบางส่วนของค่าทั้งหมดของส่วนย่อยบางส่วนของค่าหรือใด ๆของส่วนย่อยบางส่วนของค่า หมายความว่าคุณสามารถค้นหาAccounts = ["379-1111", "379-2574"]และไม่พบสิ่งที่กล่าวมา คุณสามารถค้นหาAccounts includes ["379-1111"]และค้นหาเอกสารด้านบน และคุณสามารถค้นหาAccounts includes any of ["974-3785","414-6731"]และค้นหาเอกสารข้างต้นและสิ่งใดก็ตามที่มีบัญชี "974-3785" หากมี
เอกสารดำเนินไปลึกเท่าที่คุณต้องการ PhoneNumber.Mobileสามารถเก็บอาร์เรย์หรือแม้แต่เอกสารย่อย ( PhoneNumber.Mobile.WorkและPhoneNumber.Mobile.Personal) หากข้อมูลของคุณมีโครงสร้างสูงเอกสารจะเป็นขั้นตอนใหญ่ขึ้นจากฐานข้อมูลเชิงสัมพันธ์
หากข้อมูลของคุณส่วนใหญ่แบนสัมพันธ์และโครงสร้างอย่างเหนียวแน่นคุณจะดีกว่าด้วยฐานข้อมูลเชิงสัมพันธ์ สัญญาณขนาดใหญ่คือว่าข้อมูลของคุณเป็นแบบจำลองที่ดีที่สุดในการรวบรวมไฟล์ CSV ที่เกี่ยวข้องหรือชุดของไฟล์ XML / JSON / YAML
สำหรับโครงการส่วนใหญ่คุณจะต้องประนีประนอมโดยยอมรับการแก้ไขปัญหาเล็กน้อยในพื้นที่เล็ก ๆ ที่ SQL หรือ Document Store ไม่พอดี สำหรับโครงการขนาดใหญ่และซับซ้อนที่เก็บการกระจายข้อมูลในวงกว้าง (หลายคอลัมน์; แถวไม่เกี่ยวข้อง) มันจะสมเหตุสมผลที่จะเก็บข้อมูลในรูปแบบหนึ่งและข้อมูลอื่นในรูปแบบอื่น Facebook ใช้ทั้ง SQL และฐานข้อมูลกราฟ (โดยที่ข้อมูลถูกใส่ลงในโหนดและโหนดเชื่อมต่อกับโหนดอื่น) Craigslist เคยใช้ MySQL และ MongoDB แต่ได้รับการมองการย้ายทั้งหมดไปยัง MongoDB เหล่านี้คือสถานที่ที่ช่วงและความสัมพันธ์ของข้อมูลเผชิญกับแต้มต่อสำคัญหากวางไว้ภายใต้รูปแบบเดียว
Redis: คีย์ - ค่า
Redis โดยทั่วไปแล้วเป็นที่เก็บคีย์ - ค่า Redis ให้คุณให้คีย์และค้นหาค่าเดียว Redis เองสามารถเก็บสตริงรายการแฮชและสิ่งอื่น ๆ แต่จะค้นหาตามชื่อเท่านั้น
การทำให้แคชใช้ไม่ได้เป็นปัญหาอย่างหนึ่งของวิทยาศาสตร์คอมพิวเตอร์ อื่น ๆ คือการตั้งชื่อสิ่ง นั่นหมายความว่าคุณจะใช้ Redis เมื่อคุณต้องการหลีกเลี่ยงการค้นหาเกินกว่าร้อยเป็นแบ็คเอนด์ แต่คุณจะต้องคิดออกเมื่อคุณต้องการค้นหาใหม่
กรณีที่ชัดเจนที่สุดของการทำให้การปรับปรุงในการเขียน: ถ้าคุณอ่านuser:Simon:lingots = NOTFOUNDคุณอาจSELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simonและเก็บผลที่ได้เป็น100 SET user:Simon:lingots = 100จากนั้นเมื่อคุณได้รับรางวัล Simon 5 lingots คุณอ่านuser:Simon:lingots = 100, และSET user:Simon:lingots = 105 UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simonตอนนี้คุณมี 105 ในฐานข้อมูลของคุณและใน Redis และสามารถรับได้user:Simon:lingotsโดยไม่ต้องสอบถามฐานข้อมูล
เคสที่สองกำลังอัพเดตข้อมูลที่ต้องพึ่งพา สมมติว่าคุณสร้างชิ้นของหน้าและแคชผลลัพธ์ของพวกเขา ส่วนหัวแสดงประสบการณ์ของผู้เล่นระดับและจำนวนเงิน หน้าโปรไฟล์ของผู้เล่นมีบล็อกที่แสดงสถิติของพวกเขา และอื่น ๆ ผู้เล่นได้รับประสบการณ์บางอย่าง ดีตอนนี้คุณมีหลายtemplates:Header:Simon, templates:StatsBox:Simon, templates:GrowthGraph:Simonและอื่น ๆ เขตข้อมูลที่คุณได้เก็บไว้ชั่วคราวการส่งออกของฐานข้อมูลครึ่งโหลแบบสอบถามวิ่งผ่านแม่แบบเครื่องยนต์ โดยปกติเมื่อคุณแสดงหน้าเหล่านี้คุณจะพูดว่า:
$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
$t = BuildTemplate("StatsBox.tmpl",
GetStatsFromDatabase($playerName));
SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;
เนื่องจากคุณเพิ่งอัปเดตผลลัพธ์ของGetStatsFromDatabase("Simon")คุณจึงต้องtemplates:*:Simonออกจากแคชคีย์ - ค่าของคุณ เมื่อคุณพยายามแสดงผลเทมเพลตเหล่านี้แอปพลิเคชันของคุณจะทำการดึงข้อมูลจากฐานข้อมูลของคุณ (PostgreSQL, MongoDB) และแทรกลงในเทมเพลตของคุณ จากนั้นจะเก็บผลลัพธ์ใน Redis และหวังว่าจะไม่ทำให้แบบสอบถามฐานข้อมูลและเทมเพลตการแสดงผลในครั้งถัดไปที่แสดงบล็อกของเอาต์พุตนั้น
Redis ยังช่วยให้คุณทำการจัดคิวข้อความของผู้เผยแพร่และ นั่นเป็นหัวข้ออื่นทั้งหมด จุดที่นี่คือ Redis เป็นแคชคีย์ - ค่าซึ่งแตกต่างจากฐานข้อมูลเชิงสัมพันธ์หรือที่เก็บเอกสาร
ข้อสรุป
เลือกเครื่องมือตามความต้องการของคุณ ความต้องการที่ใหญ่ที่สุดมักจะเป็นตัวแบบข้อมูลเนื่องจากมันเป็นตัวกำหนดว่ารหัสของคุณซับซ้อนและผิดพลาดอย่างไร แอปพลิเคชันเฉพาะทางจะพึ่งพาประสิทธิภาพการทำงานสถานที่ที่คุณเขียนทุกอย่างด้วยการผสมผสานของ C และแอสเซมบลี แอ็พพลิเคชันส่วนใหญ่จะจัดการกับเคสทั่วไปและใช้ระบบแคชเช่น Redis หรือ Memcached ซึ่งเร็วกว่าฐานข้อมูล SQL ประสิทธิภาพสูงหรือที่เก็บเอกสาร