ผมชอบที่จะใช้อย่างละเอียดชื่อที่อยู่ใน Redis set-allBooksBelongToUser:$userId
ตัวอย่างเช่น
ตกลงหรือส่งผลกระทบต่อประสิทธิภาพการทำงาน?
ผมชอบที่จะใช้อย่างละเอียดชื่อที่อยู่ใน Redis set-allBooksBelongToUser:$userId
ตัวอย่างเช่น
ตกลงหรือส่งผลกระทบต่อประสิทธิภาพการทำงาน?
คำตอบ:
กุญแจสำคัญที่คุณกำลังพูดถึงเกี่ยวกับการใช้งานนั้นไม่ได้ยาวแค่นั้น
ตัวอย่างคีย์ที่คุณให้คือสำหรับชุดวิธีการค้นหาชุดคือ 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:' อยู่ในนั้น) คุณสามารถเพิ่มขนาดของคำนำหน้าใน ทดสอบโค้ดตามความยาวที่คุณต้องการ
Redis ชอบที่จะเก็บคีย์ทั้งหมดไว้ในหน่วยความจำ ยิ่งความยาวคีย์เฉลี่ยของคุณยาวขึ้นเท่าใดหน่วยความจำก็ยิ่งน้อยลงเท่านั้น ใช่แล้วความยาวของคีย์สามารถส่งผลกระทบต่อประสิทธิภาพได้อย่างมาก แต่อาจไม่มากนักในแบบที่คุณกังวล นั่นคือด้วยคีย์สเปซขนาดเล็ก (เช่นคีย์ที่พอดีกับหน่วยความจำได้ง่าย) คีย์ 128 ไบต์และคีย์ 16 ไบต์จะไม่ทำงานแตกต่างกันอย่างมาก
ฉันไม่สามารถตอบคำถามนี้ด้วยความมั่นใจ อย่างไรก็ตามฉันสามารถถามคำถามและเสนอข้อสังเกตบางอย่างได้
ฉันคิดว่าเห็นได้ชัดว่าคีย์ (ชื่อ) และ / หรือค่าที่ยาวมากจะมีผลกระทบต่อประสิทธิภาพการทำงานโดยรวมหากสามารถใช้งานได้เลย ผลกระทบเหล่านี้อาจเกิดขึ้นในไคลเอนต์ผ่านเครือข่ายหรือบนเซิร์ฟเวอร์ ดังนั้นคำถามแรกที่จะลากออกจากตัวคุณคือ:
คีย์และค่าระหว่าง Redis กับลูกค้าของคุณจะอยู่ได้นานแค่ไหน?
ค้นหาในRedis , ความยาวของคีย์และข้อ จำกัดมุ้งฉันรายการบล็อกที่น่าสนใจในRedis กับ memcachedซึ่งอาจจะเริ่มต้นที่จะตอบคำถามของคุณ คำตอบแรกสำหรับรายการบล็อกนั้นดูเหมือนจะเขียนโดย Salvatore Sanfilipo ผู้สร้าง Redis (เมื่อต้นฤดูใบไม้ร่วงที่แล้ว: 09/2010) ซึ่งบอกว่าเวอร์ชันล่าสุดจะแสดงผลลัพธ์ที่ดีกว่าอย่างเห็นได้ชัด สองความคิดเห็นที่เชื่อมโยงเราไปยังRedis / memcached Benchmarkของ Salvatore ซึ่งโพสต์ไม่กี่วันหลังจากที่เขาตอบกลับ "blagger" ดั้งเดิม (ซึ่งดูเหมือนจะไม่เปิดเผยตัวตน)
สิ่งนี้ไม่ได้ตอบคำถาม (คีย์สามารถอยู่ได้นานเท่าใดและมีผลกระทบต่อประสิทธิภาพที่ตรวจพบได้ที่จุดใดบ้าง) อย่างไรก็ตามมันทำให้เราได้เบาะแสเกี่ยวกับการตอบคำถาม
ผู้เขียนบทความทั้งสองนี้เขียนโค้ดและทดสอบ ... และสร้างกราฟผลลัพธ์
เราสามารถเดาได้ทุกประเภท เราสามารถดูรหัสและพยายามหาเหตุผล
อย่างไรก็ตามวิธีที่มีความหมายที่สุดในการตอบคำถามเกี่ยวกับประเภทนี้คือการเขียนโค้ดเพื่อวัดรูปแบบการใช้งานที่เสนอ ... และอีกวิธีหนึ่งเพื่อทดสอบอีกแบบหนึ่ง (เช่นช่วงความยาวคีย์ตั้งแต่ 8 ตัวอักษรถึง ... อยากได้ ... 8 กิโลไบต์นานมั้ย) ... แล้ววัดดู
ฉันไม่คิดว่าความยาวของชื่อตัวแปรจะส่งผลต่อประสิทธิภาพตัวแปรจะเกิดขึ้นในตำแหน่งเดียวกับตัวแปรใด ๆ ที่ใช้สำหรับประเภทข้อมูลนั้นตราบเท่าที่คุณมีความยาวไม่เกินชื่อสูงสุด