Semua jawaban (pada saat penulisan ini) mengasumsikan masing-masing Redis, MongoDB, dan mungkin database relasional berbasis SQL pada dasarnya adalah alat yang sama: "menyimpan data". Mereka tidak mempertimbangkan model data sama sekali.
MongoDB: Data Kompleks
MongoDB adalah toko dokumen. Untuk membandingkan dengan database relasional yang digerakkan oleh SQL: database relasional menyederhanakan untuk file CSV yang diindeks, masing-masing file berupa tabel; penyimpanan dokumen menyederhanakan untuk mengindeks file JSON, setiap file menjadi dokumen, dengan beberapa file dikelompokkan bersama.
File JSON memiliki struktur yang mirip dengan file XML dan YAML, dan kamus seperti di Python, jadi pikirkan data Anda dalam hierarki semacam itu. Saat pengindeksan, struktur adalah kuncinya: Dokumen berisi kunci bernama, yang berisi dokumen lebih lanjut, array, atau nilai skalar. Pertimbangkan dokumen di bawah ini.
{
_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"
}
Dokumen di atas memiliki kunci PhoneNumber.Mobile
,, yang memiliki nilai 555 634-5789
. Anda dapat mencari melalui kumpulan dokumen di mana kunci PhoneNumber.Mobile
,, memiliki beberapa nilai; mereka diindeks.
Ia juga memiliki larik Accounts
yang menampung banyak indeks. Hal ini dimungkinkan untuk query untuk dokumen mana Accounts
berisi persis beberapa bagian dari nilai-nilai, semua dari beberapa bagian dari nilai-nilai, atau setiap beberapa subset dari nilai-nilai. Itu berarti Anda dapat mencari Accounts = ["379-1111", "379-2574"]
dan tidak menemukan yang di atas; Anda dapat mencari Accounts includes ["379-1111"]
dan menemukan dokumen di atas; dan Anda dapat mencari Accounts includes any of ["974-3785","414-6731"]
dan menemukan dokumen di atas dan apa pun yang termasuk akun "974-3785", jika ada.
Dokumen masuk sedalam yang Anda inginkan. PhoneNumber.Mobile
dapat menyimpan array, atau bahkan sub-dokumen ( PhoneNumber.Mobile.Work
dan PhoneNumber.Mobile.Personal
). Jika data Anda sangat terstruktur, dokumen merupakan langkah besar dari database relasional.
Jika sebagian besar data Anda datar, relasional, dan terstruktur kaku, Anda lebih baik dengan database relasional. Sekali lagi, tanda besarnya adalah apakah model data Anda paling baik untuk koleksi file CSV yang saling terkait atau koleksi file XML / JSON / YAML.
Untuk sebagian besar proyek, Anda harus berkompromi, menerima penyelesaian kecil di beberapa area kecil di mana SQL atau Document Store tidak cocok; untuk beberapa proyek besar dan kompleks yang menyimpan penyebaran data yang luas (banyak kolom; baris tidak relevan), masuk akal untuk menyimpan beberapa data dalam satu model dan data lain dalam model lain. Facebook menggunakan SQL dan basis data grafik (tempat data dimasukkan ke dalam node, dan node terhubung ke node lain); Craigslist digunakan untuk menggunakan MySQL dan MongoDB, tetapi telah mencari untuk pindah sepenuhnya ke MongoDB. Ini adalah tempat di mana rentang dan hubungan data menghadapi cacat signifikan jika diletakkan di bawah satu model.
Redis: Nilai-Kunci
Redis, pada dasarnya, adalah toko kunci-nilai. Redis memungkinkan Anda memberikan kunci dan mencari nilai tunggal. Redis sendiri dapat menyimpan string, daftar, hash, dan beberapa hal lainnya; Namun, hanya mencari nama.
Cache invalidation adalah salah satu masalah sulit ilmu komputer; yang lainnya adalah penamaan. Itu berarti Anda akan menggunakan Redis ketika Anda ingin menghindari ratusan pencarian berlebih ke back-end, tetapi Anda harus mencari tahu kapan Anda membutuhkan pencarian baru.
Kasus pembatalan yang paling jelas adalah pembaruan saat menulis: jika Anda membaca user:Simon:lingots = NOTFOUND
, Anda dapat SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simon
dan menyimpan hasilnya 100
,, sebagai SET user:Simon:lingots = 100
. Kemudian ketika Anda penghargaan Simon 5 lingots, Anda membaca user:Simon:lingots = 100
, SET user:Simon:lingots = 105
dan UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon
. Sekarang Anda memiliki 105 di database Anda dan di Redis, dan bisa dapatkan user:Simon:lingots
tanpa meminta database.
Kasus kedua adalah memperbarui informasi dependen. Katakanlah Anda menghasilkan potongan halaman dan menyimpan hasilnya. Header menunjukkan pengalaman pemain, level, dan jumlah uang; halaman Profil pemain memiliki blok yang menunjukkan statistik mereka; Dan seterusnya. Pemain mendapatkan beberapa pengalaman. Nah, sekarang Anda memiliki beberapa templates:Header:Simon
, templates:StatsBox:Simon
, templates:GrowthGraph:Simon
, dan sebagainya ladang di mana Anda cache output dari database setengah lusin query dijalankan melalui mesin template. Biasanya, ketika Anda menampilkan halaman-halaman ini, Anda mengatakan:
$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
$t = BuildTemplate("StatsBox.tmpl",
GetStatsFromDatabase($playerName));
SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;
Karena Anda baru saja memperbarui hasil GetStatsFromDatabase("Simon")
, Anda harus templates:*:Simon
keluar dari cache nilai kunci Anda. Ketika Anda mencoba merender salah satu templat ini, aplikasi Anda akan menghasilkan data dari database Anda (PostgreSQL, MongoDB) dan memasukkannya ke dalam templat Anda; maka itu akan menyimpan hasilnya di Redis dan, mudah-mudahan, tidak repot-repot membuat query database dan rendering template saat nanti menampilkan blok output itu.
Redis juga memungkinkan Anda melakukan antrian pesan berlangganan penerbit dan semacamnya. Itu topik lain sepenuhnya. Intinya di sini adalah Redis adalah cache nilai kunci, yang berbeda dari database relasional atau penyimpanan dokumen.
Kesimpulan
Pilih alat Anda berdasarkan kebutuhan Anda. Kebutuhan terbesar biasanya adalah model data, karena itu menentukan seberapa kompleks dan rawan kesalahan kode Anda. Aplikasi khusus akan bersandar pada kinerja, tempat di mana Anda menulis semuanya dalam campuran C dan Assembly; sebagian besar aplikasi hanya akan menangani case umum dan menggunakan sistem caching seperti Redis atau Memcached, yang jauh lebih cepat daripada database SQL kinerja tinggi atau toko dokumen.