Jadi, saya telah datang ke suatu tempat di mana saya ingin membagi data yang saya simpan dalam redis ke dalam basis data yang terpisah karena kadang-kadang saya perlu menggunakan perintah kunci pada satu jenis data tertentu, dan ingin memisahkannya untuk membuatnya lebih cepat .
Jika saya melakukan segmentasi ke banyak basis data, semuanya masih single threaded, dan saya masih bisa menggunakan satu inti saja. Jika saya baru saja meluncurkan instance Redis lain pada kotak yang sama, saya bisa menggunakan inti tambahan. Selain itu, saya tidak bisa memberi nama basis data Redis, atau memberi mereka pengidentifikasi yang lebih logis. Jadi, dengan semua yang dikatakan, mengapa / kapan saya ingin menggunakan beberapa database Redis alih-alih hanya memutar contoh tambahan Redis untuk setiap database tambahan yang saya inginkan? Dan terkait, mengapa Redis tidak mencoba untuk menggunakan inti tambahan untuk setiap database tambahan yang saya tambahkan? Apa keuntungan menjadi single threaded di seluruh database?
Jawaban:
Pada prinsipnya, database Redis pada contoh yang sama tidak berbeda dengan skema dalam instance database RDBMS.
Ada satu keuntungan jelas menggunakan database redis dalam instance redis yang sama, dan itu manajemen. Jika Anda memutar contoh terpisah untuk setiap aplikasi, dan katakanlah Anda memiliki 3 aplikasi, itu 3 contoh redis terpisah, masing-masing akan membutuhkan budak untuk HA dalam produksi, jadi itu 6 contoh total. Dari sudut pandang manajemen, ini menjadi sangat cepat berantakan karena Anda perlu memonitor semuanya, melakukan upgrade / patch, dll. Jika Anda tidak berencana untuk membebani redis dengan I / O tinggi, satu contoh dengan slave lebih sederhana dan lebih mudah dikelola asalkan memenuhi SLA Anda.
sumber
Anda tidak ingin menggunakan banyak basis data dalam satu instance redis. Itu sudah usang dan, seperti yang Anda catat, beberapa instance memungkinkan Anda mengambil keuntungan dari banyak core. Jika Anda menggunakan pemilihan basis data, Anda harus melakukan refactor saat meningkatkan. Memantau dan mengelola banyak kejadian tidaklah sulit atau menyakitkan.
Memang, Anda akan mendapatkan metrik yang jauh lebih baik pada setiap db berdasarkan pemisahan berdasarkan contoh. Setiap instance akan memiliki statistik yang mencerminkan segmen data tersebut, yang dapat memungkinkan penyetelan yang lebih baik dan pemantauan yang lebih responsif dan akurat. Gunakan versi terbaru dan pisahkan data Anda secara instan.
Seperti yang dikatakan Jonaton, jangan gunakan perintah tombol. Anda akan menemukan kinerja yang jauh lebih baik jika Anda hanya membuat indeks kunci. Setiap kali menambahkan kunci, tambahkan nama kunci ke set. Perintah kunci tidak terlalu berguna setelah Anda meningkatkannya karena akan membutuhkan waktu yang signifikan untuk kembali.
Biarkan pola akses menentukan bagaimana membuat struktur data Anda daripada menyimpannya dengan cara yang Anda pikir bekerja dan kemudian mencari cara untuk mengakses dan memotongnya nanti. Anda akan melihat kinerja yang jauh lebih baik dan menemukan kode yang memakan data seringkali jauh lebih bersih dan sederhana.
Mengenai threaded tunggal, pertimbangkan redis yang dirancang untuk kecepatan dan atomicity. Tentu tindakan memodifikasi data dalam satu db tidak perlu menunggu di db lain, tetapi bagaimana jika tindakan itu disimpan ke file dump, atau memproses transaksi pada budak? Pada saat itu Anda mulai masuk ke gulma pemrograman konkurensi.
Dengan menggunakan beberapa instance, Anda mengubah kompleksitas multi-threading menjadi sistem gaya menyampaikan pesan yang lebih sederhana.
sumber
Bahkan Salvatore Sanfilippo (pencipta Redis) berpikir itu adalah ide yang buruk untuk menggunakan banyak DB di Redis. Lihat komentarnya di sini:
https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion
sumber
Saya tidak benar-benar tahu manfaat memiliki banyak basis data dalam satu contoh. Saya kira itu berguna jika beberapa layanan menggunakan server database yang sama, sehingga Anda dapat menghindari tabrakan kunci.
Saya tidak akan merekomendasikan membangun sekitar menggunakan
KEYS
perintah, karena itu O (n) dan itu tidak skala dengan baik. Apa yang Anda gunakan untuk itu Anda bisa capai dengan cara lain? Mungkin redis bukan yang paling cocok untuk Anda jika fungsionalitas sukaKEYS
sangat penting.Saya pikir mereka menyebutkan manfaat dari satu server berulir di FAQ mereka, tetapi yang utama adalah kesederhanaan - Anda tidak perlu repot dengan concurrency dengan cara nyata. Setiap tindakan memblokir, jadi tidak ada dua hal yang dapat mengubah database secara bersamaan. Idealnya Anda akan memiliki satu (atau lebih) instance per core dari setiap server, dan menggunakan algoritma hashing yang konsisten (atau proxy) untuk membagi kunci di antara mereka. Tentu saja, Anda akan kehilangan beberapa fungsionalitas - perpipaan hanya akan berfungsi untuk hal-hal di server yang sama, jenis menjadi lebih sulit dll.
sumber
Saya menggunakan redis untuk mengimplementasikan daftar hitam alamat email, dan saya memiliki nilai TTL yang berbeda untuk berbagai tingkat daftar hitam, jadi memiliki DB yang berbeda pada contoh yang sama banyak membantu saya.
sumber
Basis data redis dapat digunakan dalam kasus-kasus langka penyebaran versi baru aplikasi, di mana versi baru mengharuskan bekerja dengan entitas yang berbeda.
sumber
Menggunakan banyak basis data dalam satu contoh mungkin berguna dalam skenario berikut:
Salinan berbeda dari database yang sama dapat digunakan untuk produksi, pengembangan atau pengujian menggunakan data real-time. Orang dapat menggunakan replika untuk mengkloning instance redis untuk mencapai tujuan yang sama. Namun, pendekatan sebelumnya lebih mudah bagi program yang sedang berjalan untuk hanya memilih database yang tepat untuk beralih ke mode yang dimaksud.
sumber
Saya tahu pertanyaan ini sudah berumur bertahun-tahun, tetapi ada alasan lain mengapa banyak basis data bermanfaat.
Jika Anda menggunakan "cloud Redis" dari penyedia cloud favorit Anda, Anda mungkin memiliki ukuran memori minimum dan akan membayar apa yang Anda alokasikan. Namun jika dataset Anda lebih kecil dari itu, maka Anda akan membuang sedikit alokasi, dan karenanya membuang sedikit uang.
Dengan menggunakan basis data, Anda dapat menggunakan instance cloud Redis yang sama untuk menyediakan layanan untuk (katakanlah) dev, UAT dan produksi, atau beberapa instance aplikasi Anda, atau apa pun yang lain - dengan demikian menggunakan lebih banyak memori yang dialokasikan dan dengan demikian menjadi sedikit lebih mahal- efektif.
Kasus penggunaan yang saya lihat memiliki beberapa contoh aplikasi yang masing-masing menggunakan 200-300 ribu, namun alokasi minimum pada penyedia cloud saya adalah 1 juta. Kami dapat mengkonsolidasikan 10 instance ke dalam Redis tunggal tanpa benar-benar membuat penyok dalam batas apa pun, sehingga menghemat sekitar 90% dari biaya hosting Redis. Saya menghargai ada batasan dan masalah dengan pendekatan ini, tetapi saya pikir itu layak disebut.
sumber