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 bahkan ketika fitur mereka tumpang tindih.
Untuk hal baru, gunakan Redis.
Memcached vs Redis: Perbandingan Langsung
Kedua alat ini sangat kuat, cepat, menyimpan data dalam memori yang berguna sebagai cache. Keduanya dapat membantu mempercepat aplikasi Anda dengan membuat cache hasil basis data, fragmen HTML, atau apa pun yang mungkin mahal untuk dihasilkan.
Poin untuk Dipertimbangkan
Ketika digunakan untuk hal yang sama, berikut adalah bagaimana mereka membandingkan menggunakan "Poin untuk Dipertimbangkan" pertanyaan asli:
- Kecepatan baca / tulis : Keduanya sangat cepat. Benchmark bervariasi berdasarkan beban kerja, versi, dan banyak faktor lainnya tetapi umumnya menunjukkan redis secepat atau hampir secepat memcached. Saya merekomendasikan redis, tetapi bukan karena memcached lambat. Ini bukan.
- Penggunaan memori : Redis lebih baik.
- memcached: Anda menentukan ukuran cache dan saat Anda memasukkan item, daemon dengan cepat tumbuh sedikit lebih dari ukuran ini. Tidak pernah ada cara untuk mendapatkan kembali ruang itu, sebelum memulai memcached. Semua kunci Anda dapat kedaluwarsa, Anda dapat membuka basis data, dan masih menggunakan sebagian besar RAM yang Anda konfigurasikan dengannya.
- redis: Mengatur ukuran maksimal terserah Anda. Redis tidak akan pernah menggunakan lebih dari yang seharusnya dan akan mengembalikan memori yang tidak lagi digunakan.
- Saya menyimpan 100.000 ~ 2KB string (~ 200MB) dari kalimat acak ke dalam keduanya. Penggunaan RAM memcached tumbuh hingga ~ 225MB. Penggunaan RAM Redis tumbuh hingga ~ 228MB. Setelah memerah keduanya, redis turun menjadi ~ 29MB dan memcached tetap di ~ 225MB. Mereka sama efisiennya dalam bagaimana mereka menyimpan data, tetapi hanya satu yang mampu mengklaimnya kembali.
- Disk I / O dumping : Kemenangan yang jelas untuk redis karena ia melakukan ini secara default dan memiliki kegigihan yang sangat dapat dikonfigurasi. Memcached tidak memiliki mekanisme untuk membuang ke disk tanpa alat pihak ke-3.
- 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.
memcached
Memcached adalah server cache volatile sederhana. Ini memungkinkan Anda untuk menyimpan pasangan kunci / nilai di mana nilai dibatasi menjadi string hingga 1MB.
Ini bagus dalam hal ini, tetapi hanya itu yang dilakukannya. Anda dapat mengakses nilai-nilai tersebut dengan kunci mereka pada kecepatan yang sangat tinggi, seringkali menjenuhkan jaringan yang tersedia atau bahkan bandwidth memori.
Ketika Anda me-restart memcached data Anda hilang. Ini bagus untuk cache. Anda tidak harus menyimpan sesuatu yang penting di sana.
Jika Anda memerlukan kinerja tinggi atau ketersediaan tinggi, ada alat pihak ketiga, produk, dan layanan yang tersedia.
redis
Redis dapat melakukan pekerjaan yang sama seperti memcached can, dan dapat melakukannya dengan lebih baik.
Redis dapat bertindak sebagai cache juga. Itu dapat menyimpan pasangan kunci / nilai juga. Dalam redis mereka bahkan bisa mencapai 512MB.
Anda dapat mematikan kegigihan dan itu akan dengan senang hati kehilangan data Anda saat restart juga. Jika Anda ingin cache tetap hidup, restart memungkinkan Anda melakukannya juga. Bahkan, itulah standarnya.
Ini super cepat juga, seringkali dibatasi oleh bandwidth jaringan atau memori.
Jika salah satu instance redis / memcached tidak cukup kinerja untuk beban kerja Anda, redis adalah pilihan yang jelas. Redis termasuk dukungan cluster dan dilengkapi dengan alat ketersediaan tinggi ( redis-sentinel ) tepat "di dalam kotak". Selama beberapa tahun terakhir redis juga muncul sebagai pemimpin yang jelas dalam perangkat pihak ke-3. Perusahaan seperti Redis Labs, Amazon, dan lainnya menawarkan banyak alat dan layanan redis yang bermanfaat. Ekosistem di sekitar redis jauh lebih besar. Jumlah penyebaran skala besar sekarang kemungkinan lebih besar daripada memcached.
The Redis Superset
Redis lebih dari sekadar cache. Ini adalah server struktur data dalam memori. Di bawah ini Anda akan menemukan gambaran umum singkat tentang hal-hal yang Redis dapat lakukan selain menjadi kunci / nilai cache sederhana seperti memcached. Sebagian besar fitur redis adalah hal yang tidak bisa dilakukan oleh memcached.
Dokumentasi
Redis lebih baik didokumentasikan daripada memcached. Meskipun ini bisa subjektif, tampaknya semakin benar setiap saat.
redis.io adalah sumber daya mudah dinavigasi yang fantastis. Ini memungkinkan Anda mencoba redis di browser dan bahkan memberi Anda contoh-contoh interaktif langsung dengan setiap perintah dalam dokumen.
Sekarang ada 2x lebih banyak hasil stackoverflow untuk redis dibandingkan memcached. 2x hasil Google lebih banyak. Contoh yang lebih mudah diakses dalam lebih banyak bahasa. Pengembangan lebih aktif. Pengembangan klien yang lebih aktif. Pengukuran ini mungkin tidak berarti banyak secara individual, tetapi dalam kombinasi mereka melukiskan gambaran yang jelas bahwa dukungan dan dokumentasi untuk redis lebih besar dan jauh lebih baru.
Secara default redis mempertahankan 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 tanpa penurunan kinerja. Hampir gratis!
Dalam mode snapshot ada kemungkinan crash tiba-tiba dapat menyebabkan sejumlah kecil data yang hilang. Jika Anda benar-benar perlu memastikan tidak ada data yang hilang, jangan khawatir, redis juga memiliki mode AOF (Append Only File). Dalam mode persistensi ini data dapat disinkronkan ke disk seperti yang tertulis. Ini dapat mengurangi throughput penulisan maksimum hingga seberapa cepat disk Anda dapat menulis, tetapi seharusnya masih cukup cepat.
Ada banyak opsi konfigurasi untuk memperbaiki persistensi jika Anda membutuhkannya, tetapi standarnya sangat masuk akal. Opsi ini memudahkan pengaturan redis sebagai tempat yang aman dan berlebihan untuk menyimpan data. Ini adalah database nyata .
Banyak Tipe Data
Memcached terbatas pada string, tetapi Redis adalah server struktur data yang dapat melayani banyak tipe data yang berbeda. Ini juga menyediakan perintah yang Anda butuhkan untuk memaksimalkan tipe data tersebut.
Nilai teks atau biner sederhana yang bisa berukuran hingga 512MB. Ini adalah satu-satunya tipe data redis dan berbagi memcached, meskipun string memcached dibatasi hingga 1MB.
Redis memberi Anda lebih banyak alat untuk meningkatkan tipe data ini dengan menawarkan perintah untuk operasi bitwise, manipulasi bit-level, dukungan kenaikan / penurunan titik mengambang, kisaran permintaan, 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 adalah semacam toko nilai kunci di dalam toko nilai kunci. Mereka memetakan antara bidang string dan nilai string. Field-> value map menggunakan hash sedikit lebih hemat ruang daripada key-> value map menggunakan string biasa.
Hash berguna sebagai namespace, atau ketika Anda ingin mengelompokkan banyak tombol secara logis. Dengan hash, Anda dapat mengambil semua anggota secara efisien, kedaluwarsa semua anggota, menghapus semua anggota, dll. Sangat bagus untuk semua kasus penggunaan di mana Anda memiliki beberapa pasangan kunci / nilai yang perlu dikelompokkan.
Salah satu contoh penggunaan hash adalah untuk menyimpan profil pengguna di antara aplikasi. Hash redis disimpan dengan ID pengguna karena kuncinya akan memungkinkan Anda untuk menyimpan sebanyak mungkin bit data tentang pengguna saat menyimpannya di bawah satu kunci. Keuntungan menggunakan hash daripada membuat cerita bersambung profil menjadi string adalah bahwa Anda dapat membuat aplikasi 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 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 meningkatkan daftar, termasuk perintah untuk mendorong / melontarkan item, mendorong / meloncat di antara daftar, memotong truncate, melakukan range query, dll.
Daftar membuatnya sangat tahan lama, atom, dan antrian. Ini berfungsi baik untuk antrian pekerjaan, log, buffer, dan banyak kasus penggunaan lainnya.
Set adalah koleksi nilai unik yang tidak disusun. Mereka dioptimalkan untuk memungkinkan Anda dengan cepat memeriksa apakah suatu nilai ada di set, dengan cepat menambah / menghapus nilai, dan untuk mengukur tumpang tindih dengan set lainnya.
Ini bagus untuk hal-hal seperti daftar kontrol akses, pelacak pengunjung unik, dan banyak hal lainnya. Sebagian besar bahasa pemrograman memiliki sesuatu yang mirip (biasanya disebut Set). Ini seperti itu, hanya didistribusikan.
Redis menyediakan beberapa perintah untuk mengelola set. Yang jelas seperti menambah, menghapus, dan memeriksa set sudah ada. Demikian juga perintah yang kurang jelas seperti membuka / membaca item acak dan perintah untuk melakukan serikat dan persimpangan dengan set lain.
Set Diurutkan ( perintah )
Set yang Diurutkan juga merupakan koleksi nilai unik. Yang ini, sesuai namanya, dipesan. Mereka diperintahkan oleh skor, kemudian leksikografis.
Tipe data ini dioptimalkan untuk pencarian cepat berdasarkan skor. Mendapatkan kisaran nilai tertinggi, terendah, atau apa pun di antara keduanya sangat cepat.
Jika Anda menambahkan pengguna ke set diurutkan bersama dengan skor tinggi mereka, Anda memiliki diri sendiri papan pemimpin yang sempurna. Saat skor tinggi baru masuk, tambahkan saja ke set dengan skor tinggi mereka dan itu akan memesan ulang papan pimpinan Anda. Juga bagus untuk melacak kapan terakhir kali pengguna mengunjungi dan siapa yang aktif dalam aplikasi Anda.
Menyimpan nilai dengan skor yang sama menyebabkan mereka dipesan secara leksikografis (pikirkan 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 kueri berdasarkan skor.
Geo
Redis memiliki beberapa perintah untuk menyimpan, mengambil, dan mengukur data geografis. Ini termasuk kueri radius dan mengukur jarak antar titik.
Secara teknis data geografis dalam redis disimpan dalam set yang disortir, 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 untuk apa operator tingkat bit yang saya referensikan Strings
. Tipe data ini adalah blok bangunan dasar untuk proyek seni kolaboratif terbaru reddit: r / Place .
HyperLogLog memungkinkan Anda untuk menggunakan jumlah ruang konstan yang sangat kecil untuk menghitung nilai unik yang hampir tidak terbatas dengan akurasi yang mengejutkan. Hanya menggunakan ~ 16KB, Anda dapat menghitung jumlah pengunjung unik ke situs Anda secara efisien, meskipun jumlahnya jutaan.
Transaksi dan Atomicity
Perintah dalam redis bersifat atomik, artinya Anda dapat yakin bahwa segera setelah Anda menulis nilai ke redis, nilai tersebut dapat dilihat oleh semua klien yang terhubung dengan redis. Tidak perlu menunggu nilai itu untuk menyebar. Memcached secara teknis adalah atom juga, tetapi dengan redis menambahkan semua fungsi ini di luar memcached, perlu dicatat dan agak mengesankan bahwa semua tipe data tambahan dan fitur ini juga bersifat atom.
Meskipun tidak persis sama dengan transaksi dalam database relasional, redis juga memiliki transaksi yang menggunakan "penguncian optimistis" ( WATCH / MULTI / EXEC ).
Pipelining
Redis menyediakan fitur yang disebut ' pipelining '. Jika Anda memiliki banyak perintah redis yang ingin Anda jalankan, Anda dapat menggunakan pipelining untuk mengirimnya ke redis secara bersamaan, alih-alih satu per satu.
Biasanya ketika Anda menjalankan perintah untuk redis atau memcached, setiap perintah adalah siklus permintaan / respons yang terpisah. Dengan pipelining, redis dapat buffer beberapa perintah dan menjalankan semuanya sekaligus, merespons dengan semua tanggapan 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 fungsionalitas pub / sub , yang memungkinkan redis untuk bertindak sebagai penyiar pesan berkecepatan tinggi. Ini memungkinkan satu klien untuk mempublikasikan pesan ke banyak klien lain yang terhubung ke saluran.
Redis melakukan pub / sub dan juga hampir semua alat. Pialang pesan khusus seperti RabbitMQ mungkin memiliki kelebihan di area tertentu, tetapi fakta bahwa server yang sama juga dapat memberi Anda antrian yang tahan lama dan struktur data lainnya yang mungkin dibutuhkan pub / sub kerja, Redis sering terbukti menjadi alat terbaik dan paling sederhana untuk pekerjaan.
Lua Scripting
Anda bisa memikirkan skrip lua seperti redis sendiri SQL atau prosedur tersimpan. Keduanya lebih dan kurang dari itu, tetapi analoginya kebanyakan 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 atomis. Masalah-masalah ini dan banyak lagi dapat diselesaikan dengan lua scripting.
Seluruh skrip dieksekusi secara atomik, jadi jika Anda dapat memasukkan logika Anda ke dalam skrip lua, Anda seringkali dapat menghindari mengacaukan transaksi penguncian yang optimis.
Scaling
Seperti disebutkan di atas, redis mencakup dukungan bawaan untuk pengelompokan dan dibundel dengan alat ketersediaan tinggi yang disebut redis-sentinel
.
Kesimpulan
Tanpa ragu-ragu saya akan merekomendasikan redis atas memcached untuk setiap 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 use case yang sedikit lebih cepat daripada redis. Saya suka memcached. Saya hanya berpikir itu tidak masuk akal untuk pengembangan di masa depan.
Redis melakukan semua yang dilakukan memcached, seringkali lebih baik. Setiap keuntungan kinerja untuk memcached adalah minor dan spesifik untuk beban kerja. Ada juga beban kerja yang redis akan lebih cepat, dan banyak lagi beban kerja yang bisa dilakukan redis yang tidak bisa dipcached. Perbedaan kinerja kecil tampak kecil di hadapan jurang raksasa dalam fungsionalitas dan fakta bahwa kedua alat sangat cepat dan efisien mereka mungkin merupakan bagian terakhir dari infrastruktur Anda yang Anda harus khawatir 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. Ini mungkin tidak sepadan dengan upaya untuk pindah ke redis dan jika Anda akan menggunakan redis hanya untuk caching 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 skala melampaui memcached atau Anda perlu fungsionalitas tambahan.