Câu trả lời:
Chìa khóa mà bạn đang nói về việc sử dụng không thực sự dài đến thế.
Khóa ví dụ bạn đưa ra là cho một tập hợp, các phương thức tra cứu là O (1). Các hoạt động phức tạp hơn trên một tập hợp (SDIFF, SUNION, SINTER) là O (N). Rất có thể là dân cư $userId
là một hoạt động đắt tiền hơn so với sử dụng một phím dài hơn.
Redis đi kèm với một tiện ích điểm chuẩn được gọi redis-benchmark
, nếu bạn sửa đổi kiểm tra "GET" trong src / redis-Bench.c để khóa của chúng chỉ là "foo", bạn có thể chạy thử nghiệm phím ngắn sau 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);
Đây là tốc độ thử nghiệm GET cho 3 lần chạy tiếp theo của phím ngắn "foo":
59880.24 requests per second
58139.53 requests per second
58479.53 requests per second
Đây là tốc độ kiểm tra GET sau khi sửa đổi lại nguồn và thay đổi khóa thành "set-allBooksBelongToUser: 1234567890":
60240.96 requests per second
60606.06 requests per second
58479.53 requests per second
Thay đổi phím một lần nữa để "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890" cho điều này:
58479.53 requests per second
58139.53 requests per second
56179.77 requests per second
Vì vậy, ngay cả các phím thực sự dài cũng không ảnh hưởng lớn đến tốc độ của redis. Và đây là trên GET, thao tác O (1). Các hoạt động phức tạp hơn thậm chí sẽ ít nhạy cảm hơn với điều này.
Tôi nghĩ rằng việc có các khóa xác định rõ ràng những giá trị nào chúng giữ vượt xa bất kỳ hiệu suất tốc độ cực nhỏ nào bạn có được từ các phím viết tắt.
Nếu bạn muốn thực hiện điều này hơn nữa, cũng có một -r [keyspacelen]
tham số trên tiện ích redis-Bench cho phép nó tạo các khóa ngẫu nhiên (miễn là chúng có ': rand:' trong đó), bạn chỉ cần tăng kích thước của tiền tố trong mã kiểm tra đến bất kỳ độ dài nào bạn muốn.
Redis thích giữ tất cả các phím trong bộ nhớ. Độ dài khóa trung bình của bạn càng dài, càng ít có thể được giữ trong bộ nhớ. Vì vậy, có, độ dài khóa có thể ảnh hưởng lớn đến hiệu suất nhưng có lẽ không đáng kể theo cách bạn quan tâm. Đó là, với một không gian phím nhỏ (ví dụ: không gian dễ dàng phù hợp với bộ nhớ), khóa 128 byte và khóa 16 byte sẽ không thực hiện khác nhau đáng kể.
Tôi không thể trả lời câu hỏi này với bất kỳ sự chắc chắn. Tuy nhiên, tôi có thể hỏi một số câu hỏi về nó và đưa ra một số quan sát.
Tôi nghĩ rõ ràng là các khóa (tên) và / hoặc giá trị cực kỳ dài sẽ có tác động đến hiệu suất đối với hiệu suất tổng thể nếu chúng có thể được sử dụng. Những tác động này có thể ở máy khách, qua mạng hoặc trên máy chủ. Vì vậy, câu hỏi đầu tiên để rút ra khỏi câu hỏi của bạn sẽ là:
Các khóa và giá trị có thể nằm giữa Redis và khách hàng của bạn trong bao lâu?
Tìm kiếm trên Redis , độ dài khóa và giới hạn cho tôi một mục blog thú vị trên Redis so với memcached có thể bắt đầu trả lời câu hỏi của bạn. Phản hồi đầu tiên cho mục blog đó dường như được viết bởi Salvatore Sanfilipo, người tạo ra Redis (đầu mùa thu năm ngoái: 09/2010) cho thấy rằng một phiên bản gần đây sẽ cho kết quả tốt hơn đáng kể. Hai bình luận từ đó liên kết chúng tôi với Điểm chuẩn Redis / memcached của Salvatore đã được đăng vài ngày sau khi anh ấy trả lời "lời nói xấu" ban đầu (có vẻ như là ẩn danh).
Điều này không trả lời các câu hỏi (các phím có thể kéo dài bao lâu và tại những điểm nào có thể phát hiện được các tác động đến hiệu suất). Tuy nhiên, nó cho chúng ta một manh mối về cách tiếp cận câu hỏi.
Các tác giả của cả hai bài viết này đã viết mã và kiểm tra nó ... và vẽ đồ thị kết quả.
Chúng tôi có thể đưa ra tất cả các loại dự đoán. Chúng ta có thể nhìn vào mã và cố gắng giải thích nó.
Tuy nhiên, cách có ý nghĩa nhất để tiếp cận một câu hỏi thuộc loại này là viết một số mã để đo một mẫu sử dụng được đề xuất ... và một số thứ nữa để kiểm tra một mẫu khác (ví dụ: một phạm vi độ dài khóa từ 8 ký tự đến ... lâu bạn muốn ... 8 kilobyte?) ... và đo nó.
Tôi không nghĩ độ dài của tên biến sẽ ảnh hưởng đến hiệu suất, biến sẽ diễn ra giống như bất kỳ biến nào sẽ lấy cho kiểu dữ liệu đó chừng nào bạn không vượt quá độ dài tên tối đa.