it-swarm.dev

Memcached vs Redis?

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

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.
1317
Sagiv Ofek

Ringkasan (TL; DR)

Diperbarui 3 Juni 2017

Redis lebih kuat, lebih populer, dan lebih didukung 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 melakukan 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 menggelontor basis data, dan masih akan menggunakan seluruh bagian 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 digunakan lagi.
    • Saya menyimpan 100.000 ~ 2KB string (~ 200MB) dari kalimat acak ke dalam keduanya. Memcached RAM penggunaan meningkat menjadi ~ 225MB. Redis RAM penggunaan meningkat menjadi ~ 228MB. Setelah memerah keduanya, redis turun menjadi ~ 29MB dan memcached tetap di ~ 225MB. Mereka juga efisien dalam cara 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.
  • Scaling : 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 seharusnya tidak menyimpan sesuatu yang penting di sana.

Jika Anda membutuhkan 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 satu contoh 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 fitur redis 'adalah hal-hal yang tidak dapat dilakukan dengan memcached.

Dokumentasi

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

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

Sekarang ada 2x lebih banyak hasil stackoverflow untuk redis sebagai 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 tetap menyimpan data Anda ke disk menggunakan mekanisme yang disebut snapshotting. Jika Anda memiliki cukup RAM 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 kegigihan ini data dapat disinkronkan ke disk seperti yang tertulis. Ini dapat mengurangi throughput penulisan maksimum hingga seberapa cepat disk Anda dapat menulis, tetapi harus tetap 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 basis data real.

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 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 meningkatkan daftar, termasuk perintah untuk item Push/pop, Push/pop antara daftar, daftar truncate, melakukan range query, dll.

Daftar membuat antrian sangat tahan lama, atomik,. 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 serupa (biasanya disebut Set). Ini seperti itu, hanya didistribusikan.

Redis menyediakan beberapa perintah untuk mengatur 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 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 set yang diurutkan perintah 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 di bawah Strings adalah untuk. 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 hampir tak terbatas dengan akurasi mengejutkan. Hanya menggunakan ~ 16KB Anda dapat menghitung jumlah pengunjung unik ke situs Anda secara efisien, meskipun jumlahnya mencapai jutaan.

Transaksi dan Atomicity

Perintah dalam redis bersifat atomik, artinya Anda dapat yakin bahwa segera setelah Anda menulis nilai untuk redis, nilai tersebut dapat dilihat oleh semua klien yang terhubung ke 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 atom.

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

Perpipaan

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 sekaligus, bukan hanya satu per satu.

Biasanya ketika Anda menjalankan perintah untuk redis atau memcached, setiap perintah adalah siklus permintaan/respons yang terpisah. Dengan pipelining, redis dapat menyangga beberapa perintah dan menjalankan semuanya sekaligus, merespons dengan semua respons terhadap 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 didedikasikan untuk fungsionalitas pub/sub , 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. Broker pesan khusus seperti RabbitMQ mungkin memiliki keunggulan di area tertentu, tetapi fakta bahwa server yang sama juga dapat memberikan Anda antrian yang tahan lama dan struktur data lain yang mungkin dibutuhkan pub/sub kerja, Redis akan sering terbukti sebagai yang terbaik dan alat paling sederhana untuk pekerjaan itu.

Lua Scripting

Anda bisa memikirkan skrip lua seperti SQL redis sendiri 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 sering dapat menghindari mengacaukan transaksi penguncian yang optimis.

Scaling

Seperti disebutkan di atas, redis mencakup dukungan bawaan untuk pengelompokan dan dibundel dengan alat ketersediaan tinggi sendiri 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.

1892
Carl Zulauf

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 jenis item cache tertentu 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

132
SMathew

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.

89

Ini terlalu panjang 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. Opsi maxmemory tidak secara ketat menegakkan 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 jemalloc pengalokasi memori, yang mencoba yang terbaik untuk menjadi memori-kompak dan cepat, tetapi ini 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 7 Gb RAM dan Anda ingin menggunakan redis sebagai cache LRU yang tidak persisten, Anda mungkin menemukan bahwa proses redis dengan maxmemory yang diatur ke 5Gb dari waktu ke waktu akan menggunakan lebih banyak dan lebih banyak memori , yang 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 satu potongan besar memori - semua yang pernah dibutuhkan - dan kemudian mengelola memori ini dengan sendirinya, dengan menggunakan pengalokasi slab yang diimplementasikan . 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 yang 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 sedang menabrak mesin Amazon contoh ElastiCache redis dalam satu atau dua hari karena alasan yang sama.

86
artyom

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.

45
Erik Petersen

Jika Anda tidak keberatan dengan gaya penulisan 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 LiveJournal Dormondo dan the Antirez Weblog .

Edit - 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 pustaka klien daripada throughput server. Benchmark di the Antirez Weblog memang menampilkan perbandingan yang lebih banyak dari apel ke apel (dengan mulut yang sama).

37
Paul Smith

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 cluster 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 itu juga ketika ukuran konten tunggal saya> 1MB.

3) Ketika konten tumbuh di dekat batas, kadang-kadang saya telah mengamati waktu respons yang lebih tinggi dalam statistik (tidak demikian 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,

 enter image description here

 enter image description here

Semoga ini membantu!!

22
Jain Rach

Bonus lain adalah bahwa bisa sangat jelas bagaimana memcache akan berperilaku dalam skenario caching, sementara redis umumnya digunakan sebagai datastore persisten, meskipun itu dapat dikonfigurasikan 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.

13

Uji. Jalankan beberapa tolok ukur sederhana. Untuk waktu yang lama saya menganggap diri saya badak sekolah lama karena saya menggunakan sebagian besar memcached 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 minimal lebih lambat daripada 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 keseluruhan waktu respon rata-rata lebih stabil sambil menangani lebih banyak data daripada yang bisa ditangani 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.

13
mdomans

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

9
Atif Hussain

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 ...

7
Ztyx

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");
7

Kami menganggap Redis sebagai pemindah muatan untuk proyek kami di tempat kerja. Kami berpikir bahwa dengan menggunakan modul di nginx yang disebut HttpRedis2Module atau 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 modul nginx Redis.

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

5
Ms01

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 berbeda pada instance yang sama. Jika Anda menggunakan fitur LRU dari Redis untuk cache di sepanjang penyimpanan data keras yang BUKAN LRU sangat mungkin untuk kehabisan memori.

Jika Anda akan menyiapkan instance Redis khusus untuk HANYA digunakan sebagai instance LRU untuk menghindari skenario tertentu maka 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.

5
brightball

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.

3
Denys

Redis lebih baik Kelebihan Redis adalah,

1.It has a lot of data storage options such  as  string  , sets , sorted sets ,  hashes ,  bitmaps
2.Disk Persistence of records 
3.Stored Procedure (LUA acripting)  support
4.Can act as a Message Broker using PUB/SUB

Sedangkan Memcache adalah sistem tipe cache nilai kunci dalam memori.

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

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

0
Muhammad Taqi