Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Memcache vs. Redis?

Ringkasan (TL;DR)

Diperbarui 3 Juni 2017

Redis lebih kuat, lebih populer, dan didukung lebih baik daripada memcached. Memcached hanya dapat melakukan sebagian kecil dari hal-hal yang dapat dilakukan Redis. Redis lebih baik meskipun fiturnya tumpang tindih.

Untuk sesuatu yang baru, gunakan Redis.

Memcached vs Redis:Perbandingan Langsung

Kedua alat tersebut sangat kuat, cepat, penyimpanan data dalam memori yang berguna sebagai cache. Keduanya dapat membantu mempercepat aplikasi Anda dengan meng-cache hasil database, fragmen HTML, atau apa pun yang mungkin mahal untuk dibuat.

Hal-hal yang Perlu Dipertimbangkan

Saat digunakan untuk hal yang sama, berikut adalah cara membandingkannya menggunakan "Hal yang Perlu Dipertimbangkan" dari pertanyaan awal:

  • Kecepatan baca/tulis :Keduanya sangat cepat. Tolok ukur bervariasi menurut beban kerja, versi, dan banyak faktor lainnya, tetapi umumnya menunjukkan redis secepat atau hampir secepat memcache. Saya merekomendasikan redis, tetapi bukan karena memcached lambat. Bukan.
  • Penggunaan memori :Redis lebih baik.
    • memcached:Anda menentukan ukuran cache dan saat Anda memasukkan item, daemon dengan cepat tumbuh sedikit lebih besar dari ukuran ini. Tidak pernah ada cara untuk mendapatkan kembali ruang itu, selain memulai kembali memcached. Semua kunci Anda dapat kedaluwarsa, Anda dapat menghapus basis data, dan itu akan tetap menggunakan sebagian besar RAM yang Anda konfigurasikan.
    • redis:Menyetel ukuran maksimal terserah Anda. Redis tidak akan pernah menggunakan lebih dari yang seharusnya dan akan mengembalikan memori yang tidak digunakan lagi.
    • Saya menyimpan 100.000 ~2KB string (~200MB) kalimat acak ke dalam keduanya. Penggunaan RAM memcached tumbuh menjadi ~225MB. Penggunaan RAM Redis tumbuh menjadi ~228MB. Setelah mem-flush keduanya, redis turun menjadi ~29MB dan memcached tetap di ~225MB. Mereka juga sama efisiennya dalam menyimpan data, tetapi hanya satu yang mampu mengklaimnya kembali.
  • Pembuangan I/O Disk :Kemenangan yang jelas untuk redis karena ia melakukan ini secara default dan memiliki ketekunan yang sangat dapat dikonfigurasi. Memcached tidak memiliki mekanisme untuk membuang ke disk tanpa alat pihak ketiga.
  • Penskalaan :Keduanya memberi Anda banyak ruang kepala sebelum Anda membutuhkan lebih dari satu instance sebagai cache. Redis menyertakan alat untuk membantu Anda melampaui itu sementara memcached tidak.

memcache

Memcached adalah server cache volatil sederhana. Ini memungkinkan Anda untuk menyimpan pasangan kunci/nilai di mana nilainya dibatasi menjadi string hingga 1 MB.

Ini bagus dalam hal ini, tapi hanya itu yang dilakukannya. Anda dapat mengakses nilai-nilai tersebut dengan kuncinya dengan kecepatan yang sangat tinggi, seringkali menjenuhkan jaringan yang tersedia atau bahkan bandwidth memori.

Saat Anda me-restart memcached, data Anda hilang. Ini bagus untuk cache. Anda tidak boleh menyimpan sesuatu yang penting di sana.

Jika Anda membutuhkan kinerja tinggi atau ketersediaan tinggi, ada alat, produk, dan layanan pihak ketiga yang tersedia.

redis

Redis dapat melakukan pekerjaan yang sama seperti memcached, dan dapat melakukannya dengan lebih baik.

Redis juga dapat bertindak sebagai cache. Itu dapat menyimpan pasangan kunci/nilai juga. Di redis bahkan bisa sampai 512MB.

Anda dapat mematikan kegigihan dan dengan senang hati akan kehilangan data Anda saat restart juga. Jika Anda ingin cache Anda bertahan saat dimulai ulang, Anda juga dapat melakukannya. Sebenarnya, itulah defaultnya.

Ini juga sangat cepat, sering kali dibatasi oleh bandwidth jaringan atau memori.

Jika satu instance redis/memcached tidak cukup kinerja untuk beban kerja Anda, redis adalah pilihan yang jelas. Redis menyertakan dukungan cluster dan dilengkapi dengan alat ketersediaan tinggi (redis-sentinel) tepat "di dalam kotak". Selama beberapa tahun terakhir redis juga telah muncul sebagai pemimpin yang jelas dalam perangkat pihak ke-3. Perusahaan seperti Redis Labs, Amazon, dan lainnya menawarkan banyak alat dan layanan redis yang berguna. Ekosistem di sekitar redis jauh lebih besar. Jumlah penerapan skala besar sekarang kemungkinan lebih besar daripada untuk memcached.

Superset Redis

Redis lebih dari sekadar cache. Ini adalah server struktur data dalam memori. Di bawah ini Anda akan menemukan ikhtisar singkat tentang hal-hal yang dapat dilakukan Redis selain menjadi cache kunci/nilai sederhana seperti memcached. Sebagian besar fitur redis adalah hal yang tidak dapat dilakukan memcache.

Dokumentasi

Redis didokumentasikan lebih baik daripada memcached. Meskipun ini bisa subjektif, tampaknya semakin benar setiap saat.

redis.io adalah sumber daya yang fantastis dan mudah dinavigasi. Ini memungkinkan Anda mencoba redis di browser dan bahkan memberi Anda contoh interaktif langsung dengan setiap perintah di dokumen.

Sekarang ada 2x lebih banyak hasil stackoverflow untuk redis daripada memcached. 2x lebih banyak hasil Google. Contoh yang lebih mudah diakses dalam lebih banyak bahasa. Perkembangan yang lebih aktif. Pengembangan klien lebih aktif. Pengukuran ini mungkin tidak berarti banyak secara individual, tetapi dalam kombinasi mereka memberikan gambaran yang jelas bahwa dukungan dan dokumentasi untuk redis lebih besar dan lebih mutakhir.

Kegigihan

Secara default redis menyimpan data Anda ke disk menggunakan mekanisme yang disebut snapshotting. Jika Anda memiliki cukup RAM yang tersedia, ia dapat menulis semua data Anda ke disk dengan hampir tidak ada penurunan kinerja. Ini hampir gratis!

Dalam mode snapshot, ada kemungkinan crash tiba-tiba dapat mengakibatkan sejumlah kecil data hilang. Jika Anda benar-benar perlu memastikan tidak ada data yang hilang, jangan khawatir, redis juga mendukung Anda dengan mode AOF (Append Only File). Dalam mode persistensi ini, data dapat disinkronkan ke disk seperti yang tertulis. Hal ini dapat mengurangi throughput tulis maksimum hingga seberapa cepat disk Anda dapat menulis, tetapi tetap harus cukup cepat.

Ada banyak opsi konfigurasi untuk menyempurnakan ketekunan jika Anda membutuhkannya, tetapi defaultnya sangat masuk akal. Opsi ini memudahkan penyiapan redis sebagai tempat yang aman dan redundan untuk menyimpan data. Ini adalah nyata basis data.

Banyak Jenis Data

Memcached terbatas pada string, tetapi Redis adalah server struktur data yang dapat melayani berbagai tipe data. Ini juga menyediakan perintah yang Anda butuhkan untuk memaksimalkan tipe data tersebut.

String (perintah)

Teks sederhana atau nilai biner yang dapat berukuran hingga 512MB. Ini adalah satu-satunya tipe data redis dan berbagi memcached, meskipun string memcached dibatasi hingga 1 MB.

Redis memberi Anda lebih banyak alat untuk memanfaatkan tipe data ini dengan menawarkan perintah untuk operasi bitwise, manipulasi tingkat bit, dukungan kenaikan/penurunan floating point, kueri rentang, dan operasi multi-kunci. Memcached tidak mendukung semua itu.

String berguna untuk semua jenis kasus penggunaan, itulah sebabnya memcached cukup berguna dengan tipe data ini saja.

Hash (perintah)

Hash adalah semacam penyimpanan nilai kunci di dalam penyimpanan nilai kunci. Mereka memetakan antara bidang string dan nilai string. Bidang->peta nilai menggunakan hash sedikit lebih hemat ruang daripada kunci->peta nilai menggunakan string biasa.

Hash berguna sebagai namespace, atau ketika Anda ingin mengelompokkan banyak kunci secara logis. Dengan hash, Anda dapat mengambil semua anggota secara efisien, mengakhiri semua anggota bersama-sama, menghapus semua anggota bersama-sama, dll. Bagus untuk kasus penggunaan apa pun di mana Anda memiliki beberapa pasangan kunci/nilai yang perlu dikelompokkan.

Salah satu contoh penggunaan hash adalah untuk menyimpan profil pengguna antar aplikasi. Sebuah hash redis yang disimpan dengan ID pengguna sebagai kunci akan memungkinkan Anda untuk menyimpan sebanyak mungkin data tentang pengguna yang diperlukan sambil menyimpannya di bawah satu kunci. Keuntungan menggunakan hash daripada membuat serial profil menjadi string adalah Anda dapat membuat aplikasi yang berbeda membaca/menulis bidang yang berbeda dalam profil pengguna tanpa harus khawatir tentang satu aplikasi yang menimpa perubahan yang dibuat oleh orang lain (yang dapat terjadi jika Anda membuat serial basi data).

Daftar (perintah)

Daftar redis adalah kumpulan string yang dipesan. Mereka dioptimalkan untuk menyisipkan, membaca, atau menghapus nilai dari atas atau bawah (alias:kiri atau kanan) daftar.

Redis menyediakan banyak perintah untuk memanfaatkan daftar, termasuk perintah untuk mendorong/memunculkan item, mendorong/meletakkan di antara daftar, memotong daftar, melakukan kueri jangkauan, dll.

Daftar membuat antrian yang tahan lama, atomik, dan hebat. Ini berfungsi baik untuk antrean pekerjaan, log, buffer, dan banyak kasus penggunaan lainnya.

Set (perintah)

Set adalah kumpulan nilai unik yang tidak berurutan. Mereka dioptimalkan untuk memungkinkan Anda memeriksa dengan cepat apakah suatu nilai ada dalam kumpulan, dengan cepat menambah/menghapus nilai, dan untuk mengukur tumpang tindih dengan kumpulan lain.

Ini bagus untuk hal-hal seperti daftar kontrol akses, pelacak pengunjung unik, dan banyak hal lainnya. Sebagian besar bahasa pemrograman memiliki sesuatu yang serupa (biasanya disebut Set). Ini seperti itu, hanya dibagikan.

Redis menyediakan beberapa perintah untuk mengelola set. Yang jelas seperti menambah, menghapus, dan memeriksa set ada. Begitu juga perintah yang kurang jelas seperti memunculkan/membaca item acak dan perintah untuk melakukan penyatuan dan perpotongan dengan set lain.

Set Terurut (perintah)

Set Terurut juga merupakan kumpulan nilai unik. Yang ini, seperti namanya, dipesan. Mereka diurutkan berdasarkan skor, kemudian secara leksikografis.

Tipe data ini dioptimalkan untuk pencarian cepat berdasarkan skor. Mendapatkan rentang nilai tertinggi, terendah, atau apa pun di antaranya sangat cepat.

Jika Anda menambahkan pengguna ke kumpulan yang diurutkan bersama dengan skor tinggi mereka, Anda memiliki papan peringkat yang sempurna. Saat skor tinggi baru masuk, tambahkan saja mereka ke set lagi dengan skor tinggi mereka dan itu akan menyusun ulang papan peringkat Anda. Juga bagus untuk melacak kunjungan terakhir pengguna dan siapa yang aktif di aplikasi Anda.

Menyimpan nilai dengan skor yang sama menyebabkannya diurutkan secara leksikografis (berpikir secara alfabetis). Ini dapat berguna untuk hal-hal seperti fitur pelengkapan otomatis.

Banyak dari perintah set yang diurutkan mirip dengan perintah untuk set, terkadang dengan parameter skor tambahan. Juga termasuk perintah untuk mengelola skor dan membuat kueri berdasarkan skor.

Geografis

Redis memiliki beberapa perintah untuk menyimpan, mengambil, dan mengukur data geografis. Ini termasuk kueri radius dan pengukuran jarak antar titik.

Secara teknis data geografis dalam redis disimpan dalam kumpulan yang diurutkan, jadi ini bukan tipe data yang benar-benar terpisah. Ini lebih merupakan ekstensi di atas set yang diurutkan.

Bitmap dan HyperLogLog

Seperti geo, ini bukan tipe data yang sepenuhnya terpisah. Ini adalah perintah yang memungkinkan Anda untuk memperlakukan data string seolah-olah itu bitmap atau hyperloglog.

Bitmap adalah operator tingkat bit yang saya rujuk di bawah Strings adalah untuk. Tipe data ini adalah blok bangunan dasar untuk proyek seni kolaboratif reddit baru-baru ini:r/Place.

HyperLogLog memungkinkan Anda menggunakan ruang yang sangat kecil secara konstan untuk menghitung nilai unik yang hampir tak terbatas dengan akurasi yang mengejutkan. Dengan hanya menggunakan ~16KB, Anda dapat menghitung secara efisien jumlah pengunjung unik ke situs Anda, meskipun jumlahnya jutaan.

Transaksi dan Atomisitas

Perintah dalam redis bersifat atomik, artinya Anda dapat yakin bahwa segera setelah Anda menulis nilai ke redis, nilai tersebut terlihat oleh semua klien yang terhubung ke redis. Tidak perlu menunggu sampai nilai itu menyebar. Secara teknis memcached juga bersifat atomik, tetapi dengan redis menambahkan semua fungsi ini di luar memcached, perlu diperhatikan dan agak mengesankan bahwa semua tipe dan fitur data tambahan ini juga bersifat atomik.

Meskipun tidak persis sama dengan transaksi dalam database relasional, redis juga memiliki transaksi yang menggunakan "penguncian optimis" (WATCH/MULTI/EXEC).

Pemipaan

Redis menyediakan fitur yang disebut 'pipelining'. Jika Anda memiliki banyak perintah redis yang ingin Anda jalankan, Anda dapat menggunakan pipelining untuk mengirimnya ke redis sekaligus alih-alih satu per satu.

Biasanya ketika Anda menjalankan perintah ke redis atau memcached, setiap perintah adalah siklus permintaan/tanggapan yang terpisah. Dengan pipelining, redis dapat menyangga beberapa perintah dan menjalankan semuanya sekaligus, merespons dengan semua respons untuk semua perintah Anda dalam satu balasan.

Ini dapat memungkinkan Anda untuk mencapai throughput yang lebih besar pada impor massal atau tindakan lain yang melibatkan banyak perintah.

Pub/Sub

Redis memiliki perintah yang didedikasikan untuk fungsi pub/sub, memungkinkan redis bertindak sebagai penyiar pesan berkecepatan tinggi. Ini memungkinkan satu klien untuk memublikasikan pesan ke banyak klien lain yang terhubung ke saluran.

Redis melakukan pub/sub serta hampir semua alat. Pialang pesan khusus seperti RabbitMQ mungkin memiliki keunggulan di area tertentu, tetapi fakta bahwa server yang sama juga dapat memberi Anda antrean tahan lama yang persisten dan struktur data lain yang mungkin dibutuhkan pub/sub beban kerja Anda, Redis akan sering terbukti sebagai alat terbaik dan paling sederhana untuk pekerjaan itu.

Skrip Lua

Anda dapat memikirkan skrip lua seperti SQL milik redis atau prosedur tersimpan. Keduanya lebih dan kurang dari itu, tetapi analogi sebagian besar berhasil.

Mungkin Anda memiliki perhitungan rumit yang ingin dilakukan redis. Mungkin Anda tidak mampu untuk mengembalikan transaksi Anda dan membutuhkan jaminan setiap langkah dari proses yang kompleks akan terjadi secara atomik. Masalah-masalah ini dan banyak lagi dapat diselesaikan dengan skrip lua.

Seluruh skrip dieksekusi secara atom, jadi jika Anda dapat memasukkan logika Anda ke dalam skrip lua, Anda sering kali dapat menghindari mengacaukan transaksi penguncian optimis.

Penskalaan

Seperti disebutkan di atas, redis menyertakan dukungan bawaan untuk pengelompokan dan dibundel dengan alat ketersediaan tinggi sendiri yang disebut redis-sentinel .

Kesimpulan

Tanpa ragu saya akan merekomendasikan redis over memcached untuk proyek baru, atau proyek yang sudah ada yang belum menggunakan memcached.

Di atas mungkin terdengar seperti saya tidak suka memcached. Sebaliknya:itu adalah alat yang kuat, sederhana, stabil, matang, dan mengeras. Bahkan ada beberapa kasus penggunaan yang sedikit lebih cepat daripada redis. Saya suka memcache. Saya hanya tidak berpikir itu masuk akal untuk pengembangan di masa depan.

Redis melakukan semua yang dilakukan memcached, seringkali lebih baik. Keuntungan kinerja apa pun untuk memcached kecil dan spesifik untuk beban kerja. Ada juga beban kerja yang membuat redis lebih cepat, dan banyak lagi beban kerja yang bisa dilakukan redis yang tidak bisa dilakukan memcached. Perbedaan kinerja yang kecil tampak kecil dalam menghadapi jurang besar dalam fungsionalitas dan fakta bahwa kedua alat tersebut sangat cepat dan efisien sehingga mungkin menjadi bagian terakhir dari infrastruktur Anda yang perlu Anda khawatirkan tentang penskalaan.

Hanya ada satu skenario di mana memcached lebih masuk akal:di mana memcached sudah digunakan sebagai cache. Jika Anda sudah melakukan caching dengan memcached maka tetap gunakan, jika memenuhi kebutuhan Anda. Sepertinya tidak sepadan dengan usaha untuk pindah ke redis dan jika Anda akan menggunakan redis hanya untuk caching, itu mungkin tidak menawarkan manfaat yang cukup untuk sepadan dengan waktu Anda. Jika memcached tidak memenuhi kebutuhan Anda, maka Anda mungkin harus pindah ke redis. Ini benar apakah Anda perlu menskalakan di luar memcached atau Anda membutuhkan fungsionalitas tambahan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Haruskah `StackExchange.Redis.ConnectionMultiplexer` menjadi `AddSingleton` atau `AddScope` dalam injeksi ketergantungan .NET Core?

  2. Apakah ada cara untuk flushall pada cluster sehingga semua kunci dari master dan slave dihapus dari db

  3. bagaimana cara kedaluwarsa kunci peta di REDIS?

  4. Menggunakan Redis SCAN di NODE

  5. Laravel - Hapus semua kunci cache / redis yang berisi string tertentu