ความยาวของชื่อมีผลต่อประสิทธิภาพใน Redis หรือไม่


129

ผมชอบที่จะใช้อย่างละเอียดชื่อที่อยู่ใน Redis set-allBooksBelongToUser:$userIdตัวอย่างเช่น

ตกลงหรือส่งผลกระทบต่อประสิทธิภาพการทำงาน?

คำตอบ:


198

กุญแจสำคัญที่คุณกำลังพูดถึงเกี่ยวกับการใช้งานนั้นไม่ได้ยาวแค่นั้น

ตัวอย่างคีย์ที่คุณให้คือสำหรับชุดวิธีการค้นหาชุดคือ O (1) การดำเนินการที่ซับซ้อนมากขึ้นในชุด (SDIFF, SUNION, SINTER) คือ O (N) โอกาสที่$userIdการเติมข้อมูลเป็นการดำเนินการที่มีราคาแพงกว่าการใช้คีย์ที่ยาวกว่า

Redis มาพร้อมกับยูทิลิตีมาตรฐานที่เรียกว่าredis-benchmarkหากคุณแก้ไขการทดสอบ "GET" ใน src / redis-benchmark.c เพื่อให้คีย์เป็นเพียง "foo" คุณสามารถเรียกใช้การทดสอบคีย์สั้น ๆ หลังจาก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);

นี่คือความเร็วในการทดสอบ GET สำหรับการรันคีย์สั้น "foo" 3 ครั้งต่อมา:

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

นี่คือความเร็วในการทดสอบ GET หลังจากแก้ไขซอร์สอีกครั้งและเปลี่ยนคีย์เป็น "set-allBooksBelongToUser: 1234567890":

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

เปลี่ยนที่สำคัญอีกครั้งเพื่อ "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890" จะให้นี้:

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

ดังนั้นแม้แต่คีย์ที่ยาวมากก็ไม่ได้ส่งผลกระทบอย่างมากต่อความเร็วของ redis และนี่คือ GET การดำเนินการ O (1) การดำเนินการที่ซับซ้อนมากขึ้นจะมีความไวต่อสิ่งนี้น้อยลง

ฉันคิดว่าการมีคีย์ที่ระบุอย่างชัดเจนว่าค่าใดที่พวกเขามีนั้นมีมากกว่าประสิทธิภาพความเร็วขนาดเล็กที่คุณจะได้รับจากคีย์แบบย่อ

หากคุณต้องการใช้สิ่งนี้ต่อไปนอกจากนี้ยังมี-r [keyspacelen]พารามิเตอร์ในยูทิลิตีมาตรฐาน redis ที่ช่วยให้สามารถสร้างคีย์แบบสุ่ม (ตราบเท่าที่มี ': rand:' อยู่ในนั้น) คุณสามารถเพิ่มขนาดของคำนำหน้าใน ทดสอบโค้ดตามความยาวที่คุณต้องการ


6
ต้องใช้พื้นที่เท่าไหร่? ถ้าฉันมี 1 ล้านคีย์ยาว ๆ เหล่านี้มันจะใหญ่กว่านี้มากในหน่วยความจำหรือคงอยู่ในดิสก์?
Derek Organ

9
@Derek Organ ใช่มันจะส่งผลกระทบต่อหน่วยความจำที่ใช้ไปอย่างแน่นอนดังนั้นหากคีย์ของคุณเป็นส่วนสำคัญของสิ่งที่คุณจัดเก็บและคุณกำลังประสบกับข้อ จำกัด ของหน่วยความจำคุณอาจต้องการใช้รายละเอียดน้อยลง ฉันคิดว่าคุณต้องสร้างสมดุลการใช้งานกับการพิจารณาพื้นที่ เวลาในการค้นหาโดยรวมไม่ได้ใช้คีย์นานกว่าอย่างมีนัยสำคัญ แต่พื้นที่ที่ใช้จะเท่ากับ
Ted Naleid

โดยปกติเราจะใช้ความยาวคีย์ที่สั้นที่สุดเท่าที่จะเป็นไปได้และย้าย "ความสามารถในการอ่าน" ไปยังอ็อบเจ็กต์โดเมนของเราและวิธีการ นอกจากนี้เรายังใช้เนมสเปซแบบสั้นในคีย์ของเราเพื่อช่วยในการบำรุงรักษาและการตรวจสอบใน redis โดยตรง
xentek

26

Redis ชอบที่จะเก็บคีย์ทั้งหมดไว้ในหน่วยความจำ ยิ่งความยาวคีย์เฉลี่ยของคุณยาวขึ้นเท่าใดหน่วยความจำก็ยิ่งน้อยลงเท่านั้น ใช่แล้วความยาวของคีย์สามารถส่งผลกระทบต่อประสิทธิภาพได้อย่างมาก แต่อาจไม่มากนักในแบบที่คุณกังวล นั่นคือด้วยคีย์สเปซขนาดเล็ก (เช่นคีย์ที่พอดีกับหน่วยความจำได้ง่าย) คีย์ 128 ไบต์และคีย์ 16 ไบต์จะไม่ทำงานแตกต่างกันอย่างมาก


4
Redis เป็นคำจำกัดความที่จัดเก็บในหน่วยความจำทั้งหมดดังนั้นประโยคแรกจึงทำให้ฉันงง
Lee Grissom

5
@bmatheny ถ้าฉันเข้าใจคำถามของคุณอย่างถูกต้อง Redis โดยพื้นฐานแล้วเป็นที่เก็บในหน่วยความจำและยังสนับสนุนการคงอยู่ด้วย
Najeeb

5

ฉันไม่สามารถตอบคำถามนี้ด้วยความมั่นใจ อย่างไรก็ตามฉันสามารถถามคำถามและเสนอข้อสังเกตบางอย่างได้

ฉันคิดว่าเห็นได้ชัดว่าคีย์ (ชื่อ) และ / หรือค่าที่ยาวมากจะมีผลกระทบต่อประสิทธิภาพการทำงานโดยรวมหากสามารถใช้งานได้เลย ผลกระทบเหล่านี้อาจเกิดขึ้นในไคลเอนต์ผ่านเครือข่ายหรือบนเซิร์ฟเวอร์ ดังนั้นคำถามแรกที่จะลากออกจากตัวคุณคือ:

คีย์และค่าระหว่าง Redis กับลูกค้าของคุณจะอยู่ได้นานแค่ไหน?

ค้นหาในRedis , ความยาวของคีย์และข้อ จำกัดมุ้งฉันรายการบล็อกที่น่าสนใจในRedis กับ memcachedซึ่งอาจจะเริ่มต้นที่จะตอบคำถามของคุณ คำตอบแรกสำหรับรายการบล็อกนั้นดูเหมือนจะเขียนโดย Salvatore Sanfilipo ผู้สร้าง Redis (เมื่อต้นฤดูใบไม้ร่วงที่แล้ว: 09/2010) ซึ่งบอกว่าเวอร์ชันล่าสุดจะแสดงผลลัพธ์ที่ดีกว่าอย่างเห็นได้ชัด สองความคิดเห็นที่เชื่อมโยงเราไปยังRedis / memcached Benchmarkของ Salvatore ซึ่งโพสต์ไม่กี่วันหลังจากที่เขาตอบกลับ "blagger" ดั้งเดิม (ซึ่งดูเหมือนจะไม่เปิดเผยตัวตน)

สิ่งนี้ไม่ได้ตอบคำถาม (คีย์สามารถอยู่ได้นานเท่าใดและมีผลกระทบต่อประสิทธิภาพที่ตรวจพบได้ที่จุดใดบ้าง) อย่างไรก็ตามมันทำให้เราได้เบาะแสเกี่ยวกับการตอบคำถาม

ผู้เขียนบทความทั้งสองนี้เขียนโค้ดและทดสอบ ... และสร้างกราฟผลลัพธ์

เราสามารถเดาได้ทุกประเภท เราสามารถดูรหัสและพยายามหาเหตุผล

อย่างไรก็ตามวิธีที่มีความหมายที่สุดในการตอบคำถามเกี่ยวกับประเภทนี้คือการเขียนโค้ดเพื่อวัดรูปแบบการใช้งานที่เสนอ ... และอีกวิธีหนึ่งเพื่อทดสอบอีกแบบหนึ่ง (เช่นช่วงความยาวคีย์ตั้งแต่ 8 ตัวอักษรถึง ... อยากได้ ... 8 กิโลไบต์นานมั้ย) ... แล้ววัดดู


-7

ฉันไม่คิดว่าความยาวของชื่อตัวแปรจะส่งผลต่อประสิทธิภาพตัวแปรจะเกิดขึ้นในตำแหน่งเดียวกับตัวแปรใด ๆ ที่ใช้สำหรับประเภทข้อมูลนั้นตราบเท่าที่คุณมีความยาวไม่เกินชื่อสูงสุด


6
Charlie: สิ่งเหล่านี้ไม่ใช่ "ตัวแปร" ที่เป็นกุญแจสำคัญ สำหรับคีย์ที่มีความยาวระหว่าง 1 ถึง 30 หรือ 100 หรือ 255 อักขระอาจไม่มีผลกระทบด้านประสิทธิภาพที่ตรวจพบได้ สร้างคีย์ไม่กี่กิโลไบต์ ... หรือสูงถึงสิบกิโลไบต์และฉันคิดว่าคุณจะสามารถวัดการตีประสิทธิภาพได้ (ในบางช่วงระหว่าง 1K ถึง 70K คุณจะกดปุ่มเหนือศีรษะของเครือข่ายเพิ่มเติมเนื่องจากขนาดของคีย์จะ เกิน MTU ของคุณและข้อมูลจะต้องถูกทำลายในหลาย ๆ แพ็กเก็ต ... ที่เกิด TCP และค่าใช้จ่ายในการประกอบใหม่อย่างน้อยที่สุด)
Jim Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.