Apa gunanya Multiple Redis Database?

159

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?

Eli
sumber
di aplikasi Node.js Anda, lakukan ini ---> module.exports = {"1": "nama Anda untuk redis db one", "2": "nama Anda untuk redis db two", "3": "Anda nama untuk redis db three "} dll, atau alihkan tombol dan nilai, apa pun yang Anda butuhkan
Alexander Mills
1
Di Redis 2.8.0 dan lebih tinggi, Anda disarankan untuk menggunakan SCAN alih-alih KEYS, karena ia mengulangi sejumlah kecil elemen sekaligus (sehingga tidak memblokir server untuk waktu yang lama).
TryHarder

Jawaban:

85

Pada prinsipnya, database Redis pada contoh yang sama tidak berbeda dengan skema dalam instance database RDBMS.

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?

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.

orang rafia
sumber
25
Berbagai instance Redis selalu merupakan jalan yang harus ditempuh. Titik. Jalankan kueri paralel untuk data yang berbeda. Jika pipa CICD Anda tidak membuat cluster cache untuk Anda, perbaiki itu, bukan ..... Anda mendapatkan intinya
Cmag
3
Ini tidak membahas poin OP: (1) mengapa Redis tidak mencoba memanfaatkan inti tambahan untuk setiap basis data tambahan? (2) Apa keuntungan menjadi single threaded di database?
ives
93

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.

Tagihan Asli
sumber
57
Menggunakan banyak basis data sudah tidak berlaku lagi? Bisakah Anda memberikan referensi untuk pernyataan itu? Saya sadar bahwa banyak basis data tidak didukung di Redis Cluster tetapi juga tidak ada perintah multi-kunci yang kompleks dan tidak usang.
ostergaard
27
Beberapa bukti (kuat) dari 'pemilik' Redis (menurut Google Code) bahwa "... basis data tidak akan ditinggalkan bahkan jika saya di masa lalu menyatakan bahwa itu akan menjadi".
Kenny Evitt
3
Anda tidak akan dapat menggunakan lebih dari satu redis db pada redis-cluster. Selain itu, banyak basis data akan tetap ada.
coredump
26
-1 untuk pernyataan usang. Banyak basis data mungkin berkecil hati, dan tidak didukung dalam redis-cluster, tetapi mereka tidak ditinggalkan.
AgDude
1
@ the-real-bill Bagaimana Anda bisa "membuat indeks kunci"?
Kees de Kooter
57

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

Saya mengerti bagaimana ini bisa berguna, tetapi sayangnya saya menganggap Redis banyak kesalahan database keputusan terburuk saya dalam desain Redis sama sekali ... tanpa jenis keuntungan nyata, itu membuat internal jauh lebih kompleks. Kenyataannya adalah bahwa basis data tidak skala dengan baik karena sejumlah alasan, seperti masa aktif kunci dan VM yang kadaluwarsa. Jika pemilihan DB dapat dilakukan dengan string saya dapat melihat fitur ini digunakan sebagai O (1) layer kamus scalable, yang bukan itu.

Dengan nomor DB, dengan standar beberapa DB, kami berkomunikasi dengan lebih baik tentang fitur ini dan bagaimana saya dapat menggunakannya. Saya berharap bahwa pada titik tertentu kita dapat menjatuhkan dukungan beberapa DB sama sekali, tapi saya pikir mungkin sudah terlambat karena ada sejumlah orang yang mengandalkan fitur ini untuk pekerjaan mereka.

Nirmal
sumber
4
Tunggu dulu, jadi menggunakan pemilihan DB sebenarnya kurang efisien daripada hanya menggunakan awalan? Apakah itu maksud kalimat ini di sini (bisakah seseorang mengklarifikasi)? "Jika pemilihan DB dapat dilakukan dengan sebuah string, saya dapat melihat fitur ini digunakan sebagai lapisan kamus O (1) yang dapat diukur, yang sebaliknya bukan."
dvtan
8
  1. 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.

  2. Saya tidak akan merekomendasikan membangun sekitar menggunakan KEYSperintah, 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.

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

Jonatan Hedborg
sumber
Menanggapi 2: Saya menggunakan perintah kunci hanya ketika saya membutuhkan semua kunci. Saya menggunakannya dengan cara yang sama seperti menggunakan hgetall. Keduanya adalah O (n). Kunci buruk jika Anda perlu mencari melalui serangkaian besar kunci untuk beberapa regex, tapi itu baik-baik saja jika Anda perlu melakukan beberapa operasi pada semua tombol dalam beberapa db. Menanggapi 3: Saya mengerti manfaat dari threading tunggal pada satu database. Saya tidak memahaminya di banyak basis data karena tindakan pada satu basis data tidak perlu memblokir tindakan pada basis data lain AFAIK.
Eli
3

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.

kommradHomer
sumber
1
Kami sekarang menghadapi masalah yang sama - kami ingin mendefinisikan kebijakan LRU yang berbeda untuk bagian data kami yang berbeda. dapatkah Anda membagikan bagaimana Anda menerapkan ini?
user2717436
@ user2717436 Saya tidak yakin apakah yang saya lakukan terkait dengan milik Anda, tetapi saya menggunakan basis data berbeda sebagai set yang berbeda, selalu mengatur TTL tombol ketika saya memasukkannya. seperti ada blacklist A di redis.get (1), dan setiap kali saya mengatur kunci di sana, saya mengatur expire ke 5000. dan ada blacklist B di redis.get (2) dan setiap kali saya menetapkan kunci di sana, saya atur kedaluwarsa ke 10000
kommradHomer
2

Basis data redis dapat digunakan dalam kasus-kasus langka penyebaran versi baru aplikasi, di mana versi baru mengharuskan bekerja dengan entitas yang berbeda.

Shlomi
sumber
1

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.

yoonghm
sumber
1

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.

Ralph Bolton
sumber