คำตอบทั้งหมด (ในขณะที่เขียนนี้) ถือว่า 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 ประสิทธิภาพสูงหรือที่เก็บเอกสาร