Redis adalah penyimpanan data dalam memori, yang berarti bahwa seluruh dataset disimpan dalam memori (RAM). Meskipun ini bagus untuk kinerja, ketika ukuran data mulai bertambah, semakin banyak RAM perlu ditambahkan untuk menampung semua data itu. Ini dapat dengan cepat menjadi sangat mahal dan sebelum Anda menyadarinya, biaya server mulai meroket, membuat Anda khawatir apakah Redis dapat menskalakan untuk Anda dengan cara yang hemat biaya.
Ini, tentu saja, merupakan masalah umum dengan basis data apa pun, tetapi lebih menyakitkan dalam kasus basis data dalam memori seperti Redis, karena RAM lebih mahal daripada penyimpanan sekunder seperti hard disk dan SSD. Namun, kita harus ingat bahwa Redis tidak dimaksudkan untuk menyimpan terabyte data untuk aplikasi Anda. Sebaliknya, ini dimaksudkan untuk digunakan untuk menyimpan secara khusus data yang perlu dibaca (dan pada tingkat lebih rendah, ditulis) pada tingkat yang sangat tinggi, sementara sisa data Anda dapat disimpan di basis data tradisional yang didukung disk. Untuk itu, Redis paling sering digunakan sebagai cache, hanya menyimpan data paling aktif dengan persyaratan throughput baca/tulis yang tinggi (papan skor dan pesan obrolan waktu nyata). Oleh karena itu, penyebab utama penggunaan memori yang berlebihan dengan Redis adalah perilaku aplikasi. Aplikasi Anda mungkin menyimpan data yang tidak perlu yang tidak mendapat manfaat dari berada di Redis, atau bahkan data yang sepenuhnya berlebihan, yaitu data yang tidak pernah digunakan untuk tujuan apa pun, seperti halnya pengguna ini.
Untuk mendiagnosis masalah dengan penggunaan memori yang berlebihan, kita jelas membutuhkan cara untuk mengetahui kunci mana yang menggunakan memori paling banyak sehingga kita dapat mulai mempertimbangkan dan memahami perilaku aplikasi yang menyebabkan masalah. Ingat, optimasi prematur adalah akar dari semua kejahatan, dan Redis tidak terkecuali. Kami benar-benar membutuhkan visibilitas ke dalam karakteristik memori dari kumpulan data kami bahkan untuk mulai memikirkan di mana letak masalahnya dan bagaimana kami dapat memperbaikinya. Di bawah ini, kami menjelajahi beberapa opsi yang tersedia untuk mengintip data Redis kami dan menemukan area yang dapat memperoleh manfaat dari pengoptimalan di tingkat aplikasi.
Perintah PENGGUNAAN MEMORY
Perintah bernama tepat ini tersedia sejak Redis 4.0.0 dan merupakan langkah pertama untuk men-debug masalah memori dengan Redis. Dari dokumen:
Perintah MEMORY USAGE melaporkan jumlah byte yang diperlukan oleh kunci dan nilainya untuk disimpan dalam RAM. Penggunaan yang dilaporkan adalah total alokasi memori untuk data dan overhead administratif yang diperlukan oleh kunci nilainya.
Ini contohnya:
MEMORY USAGE users_by_reputation
(integer) 2923419
Bilangan bulat sederhana yang mewakili jumlah byte yang digunakan untuk menyimpan kunci, nilai, dan overhead internal dikembalikan. Untuk menemukan penggunaan memori dari kunci tertentu dengan cepat, tidak ada yang lebih sederhana dari ini.
Dua kemungkinan kontra adalah:
- Perintah ini hanya tersedia di Redis 4.0.0 dan yang lebih baru. Ini tidak termasuk sebagian besar penyedia cloud.
- Ini hanya memberi tahu Anda memori yang digunakan oleh satu kunci, jadi kecuali Anda tahu sebelumnya kunci atau kunci mana yang menyebabkan masalah, perintah ini memiliki kegunaan yang sangat terbatas.
redis-rdb-tools
redis-rdb-tools adalah alat baris perintah kecil yang bagus yang melampaui MEMORY USAGE
sederhana perintah yang kita bahas di atas. Ini adalah alat profil memori populer dan kuat yang dibuat khusus untuk Redis yang mem-parsing file dump Redis (.rdb) dan menghasilkan profil memori terperinci untuk setiap kunci di dump, termasuk detail seperti memori yang digunakan, tipe data, jumlah elemen, dll. Ini juga memungkinkan Anda untuk memfilter kunci yang diproses, sehingga Anda dapat menjalankan analisis secara opsional pada kunci tertentu atau subset kunci yang cocok dengan pola tertentu. Output dari analisis adalah file CSV dengan kolom untuk kunci, memori yang digunakan, tipe data, jumlah elemen, dll.
Alat ini sangat bagus karena, tidak seperti MEMORY USAGE
perintah, yang hanya berfungsi pada satu kunci, alat ini menganalisis seluruh kumpulan data dan mengeluarkan hasilnya dalam format CSV, yang berarti Anda dapat memuatnya ke dalam basis data SQL apa pun dan melakukan kueri apa pun yang Anda suka, menyortirnya dan memfilternya sesuai keinginan , dengan semua kecanggihan SQL, yang memberi Anda wawasan luar biasa tentang biaya memori data Anda. Sebagai bonus, jika Anda menggunakan versi Redis sebelum 4.0.0, Anda masih dapat menggunakan alat ini untuk menganalisis kunci tunggal jika diinginkan, karena alat ini bekerja dengan menguraikan dump biner yang dihasilkan Redis, alih-alih mengandalkan Redis untuk melaporkan penggunaan memori. Di sisi lain, perbedaan dalam pendekatan ini berarti bahwa penggunaan memori yang dihitung lebih merupakan perkiraan daripada angka pasti, seperti yang disebutkan dalam dokumentasi proyek. Namun, ini sebenarnya bukan masalah ketika tujuan kami adalah mengidentifikasi masalah penggunaan memori, karena kami lebih tertarik pada ukuran relatif dari kunci dan mengidentifikasi kunci yang menggunakan lebih banyak memori secara signifikan yang seharusnya mereka gunakan, jadi beberapa byte di sini atau di sana benar-benar tidak relevan.
RDBTTools
RDBTools adalah alat berbasis web yang menawarkan beberapa alat untuk mengelola dan mengoptimalkan Redis, dengan fokus utama pada pengoptimalan memori. Itu lahir dari proyek open source redis-rdb-tools yang dibahas di atas. Dengannya, kami dapat dengan mudah menganalisis penggunaan memori server Redis kami hanya dengan menunjuk ke instance kami dan mengklik "Analisis". Alat ini mengunduh dump dari instance yang sedang berjalan dan menganalisisnya, memberi Anda UI yang apik untuk memfilter dan menyortir kunci Anda berdasarkan berbagai parameter seperti penggunaan memori, tipe data, penyandian, jumlah elemen, dll., mirip dengan baris perintah alat, tetapi tanpa upaya manual apa pun yang terlibat dalam mengambil dump, menghasilkan profil memori, menyiapkan database, mengimpor profil, menulis dan menjalankan kueri, dll.
Selain itu, RDBTools juga menghasilkan beberapa bagan dan grafik dari profil memori yang memungkinkan Anda mendapatkan wawasan yang lebih luas tentang data Anda, bersama dengan rekomendasi untuk mengoptimalkan konfigurasi server Redis Anda, berdasarkan standar industri dan pengalaman bertahun-tahun dalam mengoptimalkan Redis, untuk memeras bahkan lebih banyak penghematan memori. Selain pengoptimalan memori, ada sejumlah fitur lain yang berguna bagi siapa saja yang menggunakan Redis, seperti CLI kaya bawaan, editor konfigurasi dengan dokumentasi sebaris, visualisator data langsung yang kaya, dll.
RDBTools tersedia sebagai gambar buruh pelabuhan, tersedia di hub buruh pelabuhan, dan dapat dijalankan di mesin Anda sendiri, jadi tidak perlu khawatir tentang kebocoran data sensitif. Versi uji coba tersedia gratis selamanya, dengan beberapa batasan penggunaan. Lihat halaman harga untuk informasi lebih lanjut tentang berbagai paket berbayar yang tersedia.
Kesimpulan
Kehabisan memori adalah masalah yang tak terhindarkan saat menggunakan database dalam memori seperti Redis. Seperti semua masalah pengoptimalan, langkah pertama adalah mendiagnosis masalah dengan benar. Penting untuk menahan godaan untuk segera mengambil kesimpulan berdasarkan hipotesis yang belum diverifikasi. "Ukur, ukur, ukur" adalah nama permainan dalam hal pengoptimalan, dan ada berbagai metode dan alat untuk mendapatkan wawasan tentang masalah memori Redis Anda. Mana yang terbaik tergantung pada kebutuhan spesifik Anda dan di mana Anda berada dalam proses pengembangan. Untuk seseorang yang baru mulai menggunakan Redis, mengawasi kunci individu sudah cukup untuk memulai, sedangkan untuk pengguna berat Redis, tentu masuk akal untuk menggunakan alat GUI khusus dengan semua lonceng dan peluit untuk menghemat rasa sakit nanti. Apa pun pilihan Anda, selalu pastikan untuk memahami akar masalah Anda sebelum mencoba menyelesaikannya, dan ingat, jika Anda mengalami masalah memori dengan Redis, Anda mungkin menggunakan lebih banyak memori daripada yang sebenarnya Anda butuhkan.