Memcached vs Redis?


1467

Kami menggunakan aplikasi web Ruby dengan server Redis untuk caching. Apakah ada gunanya menguji Memcached ?

Apa yang akan memberi kami kinerja yang lebih baik? Adakah pro atau kontra antara Redis dan Memcached?

Poin yang perlu dipertimbangkan:

  • Kecepatan baca / tulis.
  • Penggunaan memori.
  • Disk I / O dumping.
  • Scaling.

38
Analisis lain selain komentar di bawah ini: Google Trends: redis vs. memcached
MarkHu

3
Satu komentar yang tidak menjamin jawaban: jika Anda melihat layanan berbasis cloud untuk dua sistem ini (mis. Heroku addons) Layanan memcached kadang-kadang sedikit lebih murah per MB untuk alasan apa pun.
Ben Roberts

Jawaban:


2106

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.

Kegigihan

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.

String ( perintah )

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 ( perintah )

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 ( 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 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 ( perintah )

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.


11
Bagaimana Memcached menawarkan pengelompokan dengan cara yang ada di server sendiri? Saya selalu menggunakan perpustakaan yang didistribusikan ke kumpulan server memcached menggunakan algoritma hashing atau modulus. Hal yang sama berlaku untuk Redis. Saya kebanyakan menggunakan Python dan tampaknya ada beberapa modul yang tidak bergantung pada perpustakaan memcached untuk menangani kolam koneksi.
whardier

2
"Transaksi dengan penguncian yang optimis (WATCH / MULTI / EXEC)" - Redis tidak memiliki transaksi yang tepat. Yaitu jika [multi, cmd1, cmd2, cmd3 (pengecualian), exec] maka cmd1 dan cmd2 akan dieksekusi.
Oleg

10
@Oleg itu tidak benar. Jika Anda menggunakan multi-exec perintah buffered (yaitu: tidak dieksekusi) sampai exec terjadi, jadi jika Anda memiliki pengecualian sebelum exec maka tidak ada perintah yang benar-benar dieksekusi. Jika exec disebut semua perintah buffered dieksekusi secara atom, kecuali, tentu saja, variabel arloji telah diubah sejak multi pertama kali dipanggil. Mekanisme terakhir ini adalah bagian penguncian yang optimis.
Carl Zulauf

3
@ Whierier Anda benar. Jawaban yang diperbarui untuk mencerminkan bahwa "dukungan" klaster memcached diaktifkan oleh alat tambahan. Seharusnya meneliti itu lebih baik.
Carl Zulauf

3
bagaimana dengan pengelompokan dengan server couchbase? (kompatibel memcached)
Ken Liu

142

Gunakan Redis jika

  1. Anda perlu secara selektif menghapus / kedaluwarsa item dalam cache. (Kamu butuh ini)

  2. Anda memerlukan kemampuan untuk menanyakan kunci dari jenis tertentu. eq. 'blog1: posting: *', 'blog2: kategori: xyz: posting: *'. Oh ya! ini sangat penting. Gunakan ini untuk membatalkan beberapa jenis item cache secara selektif. Anda juga dapat menggunakan ini untuk membatalkan cache fragmen, cache halaman, hanya objek AR dari jenis yang diberikan, dll.

  3. Kegigihan (Anda akan membutuhkan ini juga, kecuali jika Anda tidak keberatan dengan cache Anda harus melakukan pemanasan setiap kali restart. Sangat penting untuk objek yang jarang berubah)

Gunakan memcached if

  1. Memcached memberi Anda sakit kepala!
  2. umm ... pengelompokan? meh. Jika Anda ingin sejauh itu, gunakan Varnish dan Redis untuk caching fragmen dan Objek AR.

Dari pengalaman saya, saya memiliki stabilitas yang jauh lebih baik dengan Redis daripada Memcached


7
Dokumentasi Redis mengatakan bahwa menggunakan pola memerlukan pemindaian tabel. blog1: posting: * mungkin memerlukan pemindaian tabel O (N). Tentu saja, ini masih cepat pada set data berukuran cukup, karena Redis cepat. Seharusnya OK untuk pengujian atau admin.
Wisty

182
Kepala adalah lelucon, kan? :-) Saya googled untuk memcached headached tetapi tidak menemukan sesuatu yang masuk akal. (Saya baru
mengenal

11
sebagai bawah untuk alasan yang sama dari @pellucide. Redis mungkin lebih baik daripada Memcached, tetapi Memcached sepele untuk digunakan. Saya tidak pernah punya masalah dengan itu dan itu sepele untuk dikonfigurasi.
Diego Jancic

5
Terima kasih @KajMagnus untuk membuat hari saya .. mungkin seluruh minggu saya 😂
alex

@DiegoJancic Redis adalah salah satu teknologi yang paling mudah digunakan. Tanpa pengetahuan Redis sebelumnya, saya hanya perlu 20 menit untuk menginstalnya di Ubuntu menggunakan manajer paket di cloud dan mulai membuat pertanyaan sederhana. 4 jam kemudian saya bisa POC skenario yang lebih kompleks dengan memasukkan batch menggunakan skrip Lua dan memilih perpustakaan Java yang tepat (NIO) untuk meningkatkan kinerja. Saya tidak bisa membayangkan sesuatu yang lebih ramah dan mudah digunakan selain Redis.
Moose on the Loose

105

Memcached adalah multithreaded dan cepat.

Redis memiliki banyak fitur dan sangat cepat, tetapi sepenuhnya terbatas pada satu inti karena didasarkan pada perulangan acara.

Kami menggunakan keduanya. Memcached digunakan untuk objek caching, terutama mengurangi beban baca pada database. Redis digunakan untuk hal-hal seperti set yang diurutkan yang berguna untuk menggulung data deret waktu.


2
Situs dengan lalu lintas tinggi yang banyak berinvestasi dalam memcached dan memiliki hambatan db pada "profil pengguna" - data non-relasional seperti harus mengevaluasi couchbase secara paralel dengan Mongo, Redis yang biasa

2
@ siliconrockstar - cukup yakin Redis 3 masih single core; setidaknya AWS Redis (yang menggunakan 3.2.6 atau 3.2.10) memperingatkan untuk memperhitungkannya ketika melihat misalnya EngineCpuUtilization Metrics
dwanderson

1
Sepertinya Anda benar, saya pikir ketika saya berkomentar saya mendasarkannya pada sumber yang tidak lengkap. Komentar yang dihapus.
siliconrockstar

tetapi Anda masih dapat meluncurkan instance $ core_count dari Redis
Imaskar

2
Redis sangat fokus pada efisiensi - jadi Anda perlu bertanya pada diri sendiri mengapa sekelompok pengembang pintar memilih untuk tetap menggunakan utas tunggal? Dari redis docs "Tidak terlalu sering CPU menjadi hambatan Anda dengan Redis, karena biasanya Redis adalah memori atau jaringan terikat". Jika Anda menggunakan server kasar yang terikat CPU, maka Anda mungkin memiliki banyak pengguna dan toh harus memiliki beberapa server yang berlebihan. Jika Anda ingin memaksimalkan beberapa CPU pada satu server, gunakan partisi. Baca: redis.io/topics/…
robocat

91

Ini terlalu lama untuk diposting sebagai komentar untuk jawaban yang sudah diterima, jadi saya menempatkannya sebagai jawaban terpisah

Satu hal yang juga perlu dipertimbangkan adalah apakah Anda berharap memiliki batas memori atas yang sulit pada instance cache Anda.

Karena redis adalah basis data nosql dengan banyak fitur dan caching hanya satu opsi yang dapat digunakan, redis mengalokasikan memori sesuai kebutuhan - semakin banyak objek yang Anda masukkan, semakin banyak memori yang digunakan. The maxmemorypilihan tidak ketat memberlakukan penggunaan batas memori atas. Saat Anda bekerja dengan cache, kunci digusur dan kedaluwarsa; kemungkinan kunci Anda tidak semuanya berukuran sama, sehingga terjadi fragmentasi memori internal.

Secara default redis menggunakan pengalokasi memori jemalloc , yang mencoba yang terbaik untuk menjadi memori-kompak dan cepat, tetapi itu adalah pengalokasi memori tujuan umum dan tidak dapat mengimbangi banyak alokasi dan pembersihan objek yang terjadi pada tingkat tinggi. Karena itu, pada beberapa pola beban proses redis ternyata dapat membocorkan memori karena fragmentasi internal. Misalnya, jika Anda memiliki server dengan RAM 7 Gb dan Anda ingin menggunakan redis sebagai cache LRU non-persisten, Anda mungkin menemukan bahwa proses redis dengan maxmemoryset ke 5Gb dari waktu ke waktu akan menggunakan lebih banyak dan lebih banyak memori, akhirnya mencapai batas total RAM hingga pembunuh kehabisan memori mengganggu.

memcached lebih cocok untuk skenario yang dijelaskan di atas, karena mengelola ingatannya dengan cara yang sama sekali berbeda. memcached mengalokasikan sebagian besar memori - semua yang dibutuhkan - dan kemudian mengelola memori ini dengan sendirinya, menggunakan pengalokasi slab yang diimplementasikan sendiri . Selain itu, memcached berusaha keras untuk menjaga fragmentasi internal tetap rendah, karena sebenarnya menggunakan algoritma LRU per-slab , ketika penggusuran LRU dilakukan dengan mempertimbangkan ukuran objek.

Dengan demikian, memcached masih memiliki posisi kuat di lingkungan, di mana penggunaan memori harus ditegakkan dan / atau dapat diprediksi. Kami telah mencoba menggunakan redis stabil terbaru (2.8.19) sebagai pengganti memcached berbasis LRU non-persisten dalam beban kerja 10-15k op / s, dan ia membocorkan memori BANYAK; beban kerja yang sama menabrak mesin Amazon, contoh ElastiCache redis dalam satu hari atau lebih karena alasan yang sama.


2
Dari redis.io/topics/faq : Redis memiliki perlindungan bawaan yang memungkinkan pengguna untuk menetapkan batas maksimal penggunaan memori, menggunakan opsi memori maksimum dalam file konfigurasi untuk memberi batasan pada memori yang dapat digunakan Redis. Jika batas ini tercapai, Redis akan mulai membalas dengan kesalahan untuk menulis perintah (tetapi akan terus menerima perintah read-only), atau Anda dapat mengonfigurasinya untuk mengusir kunci ketika batas memori maks tercapai jika Anda menggunakan Redis untuk caching. Kami memiliki dokumentasi jika Anda berencana untuk menggunakan Redis sebagai cache LRU. tautan
StefanNch

8
Opsi @StefanNch redis ' maxmemorytidak memperhitungkan fragmentasi memori internal. Silakan lihat komentar saya di atas untuk detailnya - masalah yang saya jelaskan di sana terlihat di bawah skenario yang dijelaskan dalam halaman "Redis sebagai LRU cache" dengan opsi pembatasan memori diaktifkan. memcached, di sisi lain, menggunakan pendekatan yang berbeda untuk menghindari masalah fragmentasi memori, sehingga batas memorinya jauh lebih "keras".
artyom

46

Memcached bagus untuk menjadi key key / value store dan pandai melakukan key => STRING. Ini membuatnya sangat bagus untuk penyimpanan sesi.

Redis pandai melakukan key => SOME_OBJECT.

Itu benar-benar tergantung pada apa yang akan Anda taruh di sana. Pemahaman saya adalah bahwa dalam hal kinerja mereka cukup genap.

Semoga beruntung menemukan tolok ukur yang objektif, jika Anda menemukan beberapa kirimkan dengan cara saya.


2
IMO tipe data Redis Hash jauh lebih masuk akal untuk menyimpan variabel sesi daripada membuat serial mereka menjadi string memcached.
Carl Zulauf

6
Jika Anda peduli dengan pengalaman pengguna, jangan letakkan sesi Anda di cache. dormando.livejournal.com/495593.html
sleblanc

4
@sebleblanc Ini seharusnya tidak secara teoritis menjadi masalah dengan Redis namun karena ada kegigihan disk juga.
haknick

2
@sebleblanc memcache masih bagus di penyimpanan sesi Anda menerapkannya dengan buruk atau tidak. ya penggusuran adalah masalah tetapi tidak bisa diatasi, juga bukan masalah memcache jika Anda tidak khawatir tentang penggusuran. Sebagian besar solusi sesi memcache menggunakan cookie sebagai cadangan saya percaya.
Erik Petersen

11
"Jangan letakkan sesi Anda di cache" menyesatkan. Yang Anda maksud adalah "Jangan hanya menyimpan sesi Anda dalam cache". Siapa pun yang menyimpan data penting hanya dalam memcache harus segera dipecat.
Yakub

37

Jika Anda tidak keberatan dengan gaya menulis kasar, Redis vs Memcached di blog Systoilet layak dibaca dari sudut pandang kegunaan, tetapi pastikan untuk membaca bolak-balik dalam komentar sebelum menarik kesimpulan tentang kinerja; ada beberapa masalah metodologis (tes loop-sibuk single-threaded), dan Redis telah membuat beberapa perbaikan sejak artikel itu ditulis juga.

Dan tidak ada tautan patokan yang lengkap tanpa hal-hal yang membingungkan, jadi periksa juga beberapa tolok ukur yang bertentangan di Liveondo Journal dan Antirez Weblog milik Dormondo .

Sunting - seperti yang ditunjukkan oleh Antirez, analisis Systoilet agak salah dipahami. Bahkan di luar kekurangan single-threading, banyak perbedaan kinerja dalam tolok ukur tersebut dapat dikaitkan dengan perpustakaan klien daripada throughput server. Benchmark di Antirez Weblog memang menyajikan perbandingan yang lebih banyak antara apel dengan apel (dengan mulut yang sama).



28
Anda tidak bercanda tentang omong kosong.
ocodo

1
Lebih dari 2010, blog usang
Siddharth

24

Saya mendapat kesempatan untuk menggunakan memcached dan redis secara bersamaan dalam proxy caching yang telah saya kerjakan, izinkan saya membagikan kepada Anda di mana tepatnya saya telah menggunakan apa dan alasan di balik yang sama ....

Redis>

1) Digunakan untuk mengindeks konten cache, melalui cluster. Saya memiliki lebih dari miliar kunci yang tersebar di kluster redis, waktu respons redis sangat kurang dan stabil.

2) Pada dasarnya, ini adalah toko kunci / nilai, jadi di mana pun dalam aplikasi Anda Anda memiliki sesuatu yang serupa, orang dapat menggunakan redis dengan banyak mengganggu.

3) Kegigihan, kegagalan, dan cadangan redis (AOF) akan membuat pekerjaan Anda lebih mudah.

Memcache>

1) ya, memori yang dioptimalkan yang dapat digunakan sebagai cache. Saya menggunakannya untuk menyimpan konten cache agar sering diakses (dengan 50 hit / detik) dengan ukuran kurang dari 1 MB.

2) Saya hanya mengalokasikan 2GB dari 16 GB untuk memcached juga ketika ukuran konten tunggal saya> 1MB.

3) Ketika konten tumbuh mendekati batas, kadang-kadang saya telah mengamati waktu respons yang lebih tinggi dalam statistik (bukan halnya dengan redis).

Jika Anda meminta pengalaman keseluruhan, Redis berwarna hijau karena mudah dikonfigurasikan, lebih fleksibel dengan fitur-fitur kuat yang stabil.

Selanjutnya, ada hasil pembandingan yang tersedia di tautan ini , di bawah ini adalah beberapa higlight dari yang sama,

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Semoga ini membantu!!


14

Uji. Jalankan beberapa tolok ukur sederhana. Untuk waktu yang lama saya menganggap diri saya badak jadul sejak saya memcached sebagian besar dan menganggap Redis anak baru.

Dengan perusahaan saya saat ini, Redis digunakan sebagai cache utama. Ketika saya menggali beberapa statistik kinerja dan baru saja memulai pengujian, Redis, dalam hal kinerja, sebanding atau lebih lambat dari MySQL.

Memcached, meskipun sederhana, meniup Redis dari air sepenuhnya . Skala ini jauh lebih baik:

  • untuk nilai yang lebih besar (diperlukan perubahan ukuran slab, tetapi berhasil)
  • untuk beberapa permintaan bersamaan

Juga, kebijakan pengusiran memcached dalam pandangan saya, jauh lebih baik diimplementasikan, sehingga secara keseluruhan waktu respon rata-rata lebih stabil sambil menangani lebih banyak data daripada yang bisa ditangani oleh cache.

Beberapa benchmark menunjukkan bahwa Redis, dalam kasus kami, berkinerja sangat buruk. Saya percaya ini ada hubungannya dengan banyak variabel:

  • jenis perangkat keras tempat Anda menjalankan Redis
  • jenis data yang Anda simpan
  • Jumlah mendapat dan set
  • seberapa serentak aplikasi Anda
  • apakah Anda memerlukan penyimpanan struktur data

Secara pribadi, saya tidak setuju dengan pandangan yang Redis miliki tentang konkurensi dan multithreading.


tolong jelaskan "lebih lambat dari MySQL."
Anirudha Gupta

Truty diberi tahu bahwa saya tidak memiliki data patokan ini, tetapi kasus khusus itu banyak operasi baca / tulis
mdomans

13

Bonus lain adalah bahwa bisa sangat jelas bagaimana memcache akan berperilaku dalam skenario caching, sementara redis umumnya digunakan sebagai datastore persisten, meskipun itu dapat dikonfigurasi untuk berperilaku seperti memcached alias mengusir. kapasitas.

Beberapa aplikasi yang telah saya kerjakan menggunakan keduanya hanya untuk memperjelas bagaimana kami bermaksud data berperilaku - hal-hal dalam memcache, kami menulis kode untuk menangani kasus-kasus di mana tidak ada - hal-hal dalam redis, kami mengandalkan itu ada di sana .

Selain itu Redis umumnya dianggap unggul karena kebanyakan kasus penggunaan lebih kaya fitur dan dengan demikian fleksibel.


10

Itu tidak akan salah, jika kita mengatakan bahwa redis adalah kombinasi dari (cache + struktur data) sementara memcached hanyalah sebuah cache.


1
ini jawaban yang bagus - Laravel menggunakan redis sebagai cache dan sebagai mekanisme penyimpanan data
Miroslav Trninic

8

Tes yang sangat sederhana untuk mengatur dan mendapatkan 100 ribu kunci unik dan nilai terhadap redis-2.2.2 dan memcached. Keduanya berjalan di linux VM (CentOS) dan kode klien saya (disisipkan di bawah) berjalan di desktop windows.

Redis

  • Waktu yang diperlukan untuk menyimpan nilai 100000 adalah = 18954ms

  • Waktu yang diambil untuk memuat nilai 100000 adalah = 18328ms

Memcached

  • Waktu yang diperlukan untuk menyimpan nilai 100000 adalah = 797ms

  • Waktu yang diambil untuk mengambil nilai 100000 adalah = 38984ms


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

6
Karena Anda jelas menggunakan Java untuk pengukuran .... apakah Anda "menghangatkan" test case Anda? Ini penting untuk mengukur waktu sesingkat itu ... sehingga JIT mengumpulkan titik panas.
CLJK

7

Satu perbedaan utama yang belum ditunjukkan di sini adalah bahwa Memcache memiliki batas memori atas setiap saat, sedangkan Redis tidak secara default (tetapi dapat dikonfigurasikan ke). Jika Anda selalu ingin menyimpan kunci / nilai untuk jangka waktu tertentu (dan tidak pernah mengusirnya karena memori rendah) Anda ingin menggunakan Redis. Tentu saja, Anda juga berisiko kehabisan memori ...


6

Alasan terbesar yang tersisa adalah spesialisasi.

Redis dapat melakukan banyak hal yang berbeda dan satu efek sampingnya adalah pengembang dapat mulai menggunakan banyak set fitur yang berbeda pada contoh yang sama. Jika Anda menggunakan fitur LRU dari Redis untuk cache di sepanjang sisi penyimpanan data keras yang BUKAN LRU itu sepenuhnya mungkin untuk kehabisan memori.

Jika Anda akan menyiapkan instance Redis khusus untuk HANYA digunakan sebagai instance LRU untuk menghindari skenario tertentu, maka sebenarnya tidak ada alasan kuat untuk menggunakan Redis daripada Memcached.

Jika Anda memerlukan cache LRU yang "tidak pernah turun" yang dapat diandalkan ... Memcached akan sesuai dengan tagihan karena tidak mungkin untuk kehabisan memori dengan desain dan fungsi khusus mencegah pengembang mencoba membuatnya sehingga sesuatu yang dapat membahayakan itu. Pemisahan sederhana dari keprihatinan.


6

Memcached akan lebih cepat jika Anda tertarik pada kinerja, hanya karena Redis melibatkan jaringan (panggilan TCP). Memcache secara internal juga lebih cepat.

Redis memiliki lebih banyak fitur seperti yang disebutkan oleh jawaban lain.


6

Kami menganggap Redis sebagai pemindah muatan untuk proyek kami di tempat kerja. Kami berpikir bahwa dengan menggunakan modul yang nginxdisebut HttpRedis2Moduleatau sesuatu yang serupa kami akan memiliki kecepatan yang luar biasa tetapi ketika pengujian dengan AB-test kami terbukti salah.

Mungkin modulnya jelek atau tata letak kami tapi itu tugas yang sangat sederhana dan bahkan lebih cepat untuk mengambil data dengan php dan kemudian memasukkannya ke dalam MongoDB. Kami menggunakan APC sebagai sistem caching dan dengan php dan MongoDB itu. Itu jauh lebih cepat daripada nginxmodul Redis.

Kiat saya adalah mengujinya sendiri, melakukannya akan menunjukkan hasil untuk lingkungan Anda. Kami memutuskan bahwa menggunakan Redis tidak perlu dalam proyek kami karena itu tidak masuk akal.


Jawaban yang menarik tetapi tidak yakin apakah itu membantu OP
Scott Schulthess

Memasukkan ke Redis dan menggunakannya sebagai cache lebih lambat daripada menggunakan APC + PHP + MongoDB. Tapi hanya penyisipan ke Redis JAUH lebih lambat daripada memasukkan langsung ke MongoDB. Tanpa APC saya pikir mereka cukup sama.
Ms01

2
Thats karena mongo tidak memberikan jaminan bahwa apa yang Anda masukkan pernah akan ditulis ke disk ...
Damian

21
tetapi ini webscale, mongodb akan berjalan di sekitar Anda dalam lingkaran saat Anda menulis. Saat ini saya hanya menulis ke / dev / null karena itu yang tercepat.
Ms01

1

Redis lebih baik.

Kelebihannya Redisadalah,

  1. Ini memiliki banyak opsi penyimpanan data seperti string, set, set diurutkan, hash, bitmap
  2. Disk Persistensi catatan
  3. LUADukungan Stored Procedure ( scripting)
  4. Dapat bertindak sebagai Pialang Pesan menggunakan PUB / SUB

Sedangkan Memcachesistem jenis cache nilai kunci dalam memori.

  1. Tidak ada dukungan untuk berbagai penyimpanan tipe data seperti daftar, ditetapkan seperti dalam redis.
  2. Kekurangan utama adalah Memcache tidak memiliki ketekunan disk.

0

Yah saya sebagian besar menggunakan keduanya dengan aplikasi saya, Memcache untuk cache sesi dan redis untuk objek permintaan doctrine / orm. Dari segi kinerja keduanya hampir sama.


0

Inilah artikel / perbedaan hebat yang disediakan oleh Amazon

Redis adalah pemenang yang jelas dibandingkan dengan memcached.

Hanya satu poin plus untuk Memcached. Ini multithreaded dan cepat. Redis memiliki banyak fitur hebat dan sangat cepat, tetapi terbatas pada satu inti.

Poin hebat tentang Redis, yang tidak didukung di Memcached

  • Snapshots - Pengguna dapat mengambil snapshot cache Redis dan bertahan pada penyimpanan sekunder setiap saat.
  • Dukungan bawaan untuk banyak struktur data seperti Set, Map, SortedSet, List, BitMaps dll.
  • Dukungan untuk Lua scripting di redis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.