Apakah panjang nama berdampak pada kinerja Redis?

129

Saya suka menggunakan nama verbose di Redis, misalnya set-allBooksBelongToUser:$userId.

Apakah ini ok atau apakah itu berdampak pada kinerja?

Running Turtle
sumber

Jawaban:

198

Kunci yang Anda bicarakan tentang penggunaan tidak terlalu lama.

Contoh kunci yang Anda berikan adalah untuk satu set, set metode pencarian adalah O (1). Operasi yang lebih kompleks pada set (SDIFF, SUNION, SINTER) adalah O (N). Kemungkinan populasinya $userIdadalah operasi yang lebih mahal daripada menggunakan kunci yang lebih panjang.

Redis hadir dengan utilitas benchmark yang disebut redis-benchmark, jika Anda memodifikasi tes "GET" di src / redis-benchmark.c sehingga kunci mereka hanya "foo", Anda dapat menjalankan tes kunci pendek setelah make install:

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

Inilah kecepatan uji GET untuk 3 kali pemanggilan kunci "foo" selanjutnya:

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

Inilah kecepatan uji GET setelah memodifikasi sumber lagi dan mengubah kunci menjadi "set-allBooksBelongToUser: 1234567890":

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

Mengubah kunci lagi untuk "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890" memberikan ini:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

Jadi kunci yang sangat panjang sekalipun tidak memiliki dampak besar pada kecepatan redis. Dan ini pada GET, operasi O (1). Operasi yang lebih kompleks akan menjadi kurang sensitif terhadap hal ini.

Saya pikir memiliki kunci yang secara jelas mengidentifikasi nilai-nilai apa yang dipegangnya jauh lebih besar daripada kinerja kecepatan sangat kecil yang akan Anda dapatkan dari kunci yang disingkat.

Jika Anda ingin melanjutkan ini, ada juga -r [keyspacelen]parameter pada utilitas redis-benchmark yang memungkinkannya membuat kunci acak (selama mereka memiliki ': rand:' di dalamnya), Anda bisa menambah ukuran awalan di menguji kode dengan panjang berapa pun yang Anda inginkan.

Ted Naleid
sumber
6
bagaimana dengan berapa banyak ruang yang dibutuhkan? jika saya memiliki 1 juta kunci yang sangat panjang ini akankah itu jauh lebih besar dalam memori atau bertahan ke disk?
Derek Organ
9
@Derek Organ ya, itu pasti akan berdampak pada memori yang diambil, jadi jika kunci Anda adalah bagian signifikan dari apa yang Anda simpan dan Anda mengalami keterbatasan memori, Anda mungkin ingin menjadi kurang verbose. Saya pikir Anda perlu menyeimbangkan kegunaan dengan pertimbangan ruang. Waktu pencarian keseluruhan tidak secara signifikan lebih lama dengan kunci, tetapi ruang yang diambil akan menjadi.
Ted Naleid
Kami biasanya menggunakan panjang kunci sesingkat mungkin dan memindahkan "keterbacaan" ke objek domain kami dan metode mereka. Kami juga menggunakan ruang nama pendek di kunci kami untuk membantu pemeliharaan dan inspeksi di redis secara langsung.
xentek
26

Redis suka menyimpan semua tombol di memori. Semakin lama panjang kunci rata-rata, semakin sedikit yang dapat disimpan di memori. Jadi ya, panjang kunci dapat sangat memengaruhi kinerja tetapi mungkin tidak signifikan dalam cara Anda khawatir. Yaitu, dengan ruang tombol yang kecil (mis. Yang cocok dengan mudah dalam memori), kunci 128 byte dan kunci 16 byte tidak akan bekerja secara berbeda secara dramatis.

bathatheny
sumber
4
Redis secara definisi adalah toko all-in-memory, jadi kalimat pertama membingungkan bagi saya.
Lee Grissom
5
@ bmatheny, jika saya memahami pertanyaan Anda dengan benar, Redis pada dasarnya adalah toko di dalam memori, dan itu juga mendukung kegigihan
Najeeb
5

Saya tidak bisa menjawab pertanyaan ini dengan pasti. Namun, saya dapat mengajukan beberapa pertanyaan tentang hal itu dan menawarkan beberapa pengamatan.

Saya pikir jelas bahwa kunci yang sangat panjang (nama) dan / atau nilai akan memiliki dampak kinerja pada kinerja keseluruhan jika mereka dapat digunakan sama sekali. Dampak ini bisa di klien, melalui jaringan, atau di server. Jadi pertanyaan pertama yang harus Anda tarik adalah:

Berapa lama kunci dan nilai antara Redis dan klien Anda?

Mencari di Redis , panjang dan batas kunci memberi saya entri blog yang menarik tentang Redis vs memcached yang mungkin mulai menjawab pertanyaan Anda. Respons pertama terhadap entri blog itu tampaknya ditulis oleh Salvatore Sanfilipo, pencipta Redis (awal musim gugur lalu: 09/2010) yang menunjukkan bahwa versi yang lebih baru akan menunjukkan hasil yang jauh lebih baik. Dua komentar di bawah dari tautan itu kami ke Redis Salvatore / Benchmark memcached yang diposting beberapa hari setelah ia menanggapi "blagger" asli (yang tampaknya anonim).

Ini tidak menjawab pertanyaan (berapa lama kunci bisa dan pada titik mana ada dampak yang dapat dideteksi terhadap kinerja). Namun, itu memberi kita petunjuk tentang pendekatan pertanyaan.

Penulis kedua artikel ini menulis kode dan mengujinya ... dan membuat grafik hasilnya.

Kita bisa membuat segala macam dugaan. Kita bisa melihat kodenya dan mencoba beralasan.

Namun, cara paling bermakna untuk mendekati pertanyaan semacam ini adalah menulis beberapa kode untuk mengukur satu pola penggunaan yang diajukan ... dan beberapa lagi untuk menguji yang lain (misalnya rentang panjang kunci mulai dari 8 karakter hingga ... bagaimana Anda ingin ... 8 kilobyte?) ... dan mengukurnya.

Jim Dennis
sumber
-7

Saya tidak berpikir panjang nama variabel akan mempengaruhi kinerja, variabel akan mengambil tempat yang sama seperti variabel apa pun akan mengambil untuk tipe data sejauh Anda tidak melebihi panjang nama maksimum.

cinta ilmu Komputer
sumber
6
Charlie: ini bukan benar-benar "variabel" mereka adalah kunci. Untuk tombol antara 1 dan 30 atau 100, atau bahkan 255 karakter mungkin tidak ada dampak kinerja yang terdeteksi. Buat kunci beberapa kilobyte ... atau naik ke puluhan kilobyte dan saya bayangkan Anda akan dapat mengukur hit kinerja (pada titik antara 1K dan 70K Anda akan menekan overhead jaringan tambahan karena ukuran kunci akan melebihi MTU Anda dan data harus dipecah di beberapa paket ... menimbulkan TCP dan setidaknya memasang kembali overhead).
Jim Dennis