Liệu chiều dài tên có ảnh hưởng đến hiệu suất trong Redis?


129

Tôi thích sử dụng tên verbose trong Redis, ví dụ set-allBooksBelongToUser:$userId.

Điều này có ổn không hay điều đó có ảnh hưởng đến hiệu suất không?

Câu trả lời:


198

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ư $userIdlà 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.


5
Nó chiếm bao nhiêu không gian? Nếu tôi có 1 triệu trong số các phím thực sự dài này thì nó sẽ lớn hơn nhiều trong bộ nhớ hay tồn tại trên đĩa?
Derek Organ

9
@Derek Organ yep, nó chắc chắn sẽ ảnh hưởng đến bộ nhớ, vì vậy nếu các khóa của bạn là một phần đáng kể của những gì bạn đang lưu trữ và bạn đang chạy vào giới hạn bộ nhớ, bạn có thể muốn ít dài dòng hơn. Tôi nghĩ bạn cần cân bằng khả năng sử dụng với những cân nhắc về không gian. Thời gian tra cứu tổng thể không lâu hơn đáng kể với các phím, nhưng không gian sẽ chiếm.
Ted Naleid

Chúng tôi thường sử dụng độ dài khóa ngắn nhất có thể và di chuyển "khả năng đọc" sang các đối tượng miền và phương thức của chúng. Chúng tôi cũng sử dụng các không gian tên ngắn trong các khóa của mình để giúp bảo trì và kiểm tra trực tiếp.
xentek

26

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


4
Redis theo định nghĩa là một cửa hàng tất cả trong bộ nhớ, vì vậy câu đầu tiên là gây bối rối cho tôi.
Lee Grissom

5
@bmatheny, nếu tôi hiểu chính xác truy vấn của bạn, Redis về cơ bản là một cửa hàng trong bộ nhớ và nó cũng hỗ trợ sự bền bỉ
Najeeb

5

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óagiớ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ó.


-7

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.


6
Charlie: đây không thực sự là "biến số" mà chúng là chìa khóa. Đối với các khóa từ 1 đến 30 hoặc 100 hoặc thậm chí 255 ký tự, có thể không có bất kỳ tác động hiệu suất có thể phát hiện nào. Tạo các khóa của một vài kilobyte ... hoặc lên đến hàng chục kilobyte và tôi tưởng tượng rằng bạn có thể đo được hiệu năng (tại một số điểm trong khoảng từ 1K đến 70K, bạn sẽ đạt được kết nối mạng bổ sung vì kích thước khóa sẽ vượt quá MTU của bạn và dữ liệu sẽ phải được chia thành nhiều gói ... phát sinh TCP và ít nhất là phải lắp lại chi phí).
Jim Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.