2011-07-02 17 views
12

Chi tiết hơn một chút: chúng tôi đã cố gắng tận dụng tối đa các zipmaps, ziplists, v.v. và tôi tự hỏi liệu các biểu diễn này đã được nén hay chỉ là các chuỗi và danh sách được nối tiếp; nén nào làm giảm đáng kể mức sử dụng bộ nhớ?Nén các chuỗi trước khi đặt chúng vào dấu đỏ - nó có hợp lý không?

Ngoài ra, chi phí nén trên lớp máy chủ ứng dụng có được bù đắp bằng cách sử dụng mạng thấp hơn không? StackOverflow's experience đề xuất nó, bất kỳ ý kiến ​​nào khác?

Tóm lại, có hợp lý không - cho cả chuỗi ngắn và dài hơn?

Trả lời

2

Redis và khách hàng thường được IO ràng buộc và chi phí IO thường có ít nhất 2 đơn vị độ lớn đối với phần còn lại của chuỗi yêu cầu/trả lời. Tải trọng nhỏ hơn sẽ cung cấp cho bạn thông lượng cao hơn và độ trễ thấp hơn.

Tôi không tin rằng có bất kỳ quy tắc cứng và nhanh nào ngoài: cost of compression << IO gains. Bạn nên đặt nó và tìm chỗ mồ hôi trong thiết lập giới hạn dưới, nhưng MTU của mạng của bạn không phải là điểm khởi đầu xấu cho giới hạn dưới.

+1

Tôi đã tìm thấy [điểm chuẩn này] (http://dev.mensfeld.pl/2013/04/compressing-large-data-sets-in-redis-with-gzip-ruby-test-case/) rất hữu ích và [những suy nghĩ bổ sung này] (http://nosql.mypopescu.com/post/46926679137/compressing-large-data-sets-in-redis-with-gzip). – robert4

14

Redis không nén các giá trị của bạn và nếu bạn tự nén chúng, phụ thuộc rất nhiều vào kích thước của chuỗi bạn sẽ lưu trữ. Đối với các chuỗi lớn, hàng trăm K và nhiều hơn nữa có thể đáng giá chu kỳ CPU phụ ở phía máy khách, giống như khi bạn phục vụ các trang web, nhưng đối với các chuỗi ngắn hơn, nó có thể lãng phí thời gian. Các chuỗi ngắn thường không nén nhiều, vì vậy mức tăng sẽ quá nhỏ.

+0

Vì vậy, với điều gì đó khoảng 10K, bạn nói không nén - tôi có đúng không? Điều gì về một trường hợp cụ thể, nơi bạn có nhiều nội dung nhất quán khoảng 2 đến 5K JSON, gzipping cấp thấp sẽ giảm dấu chân bộ nhớ của những yếu tố đó ít nhất là 2, đặc biệt nếu những kết quả đó được biểu diễn dưới dạng zipmaps ? Hoặc tôi sai – Hristo

+0

Nếu bạn có thể giảm kích thước của các chuỗi của bạn bởi một yếu tố của hai, sau đó bằng mọi cách, bạn nên nén chúng. Những gì tôi nói là nó không phải là ở tất cả chắc chắn rằng bạn sẽ nhận được đủ nén trên dây nhỏ. Tùy thuộc vào nội dung của các chuỗi, 2-5K có thể quá thấp.XML nén rất độc đáo vì các tên thẻ lặp lại, nhưng dữ liệu hình ảnh trong JPEG, GIF hoặc PNG không nén chút nào vì nó đã được nén, các loại dữ liệu khác có các thuộc tính khác. Kiểm tra tải dữ liệu không nén và xem xét việc sử dụng bộ nhớ ('redis-cli info | grep used_memory') và sau đó với dữ liệu nén. – Theo

6

Có một cách thực tế để có được nén tốt, ngay cả đối với dây rất nhỏ (50 byte) -

Nếu giá trị của bạn là hơi tương tự như nhau - ví dụ, họ đang đại diện JSON của một vài liên quan các lớp đối tượng - bạn có thể tính toán trước từ điển nén/giải nén dựa trên một số văn bản mẫu.

Nghe có vẻ phức tạp, nhưng nó đơn giản trong thực tế - và đơn giản hơn với mã trình bao bọc bên phải để xử lý nó.

Dưới đây là một việc thực hiện Python:

https://github.com/internetarchive/openlibrary/blob/master/openlibrary/utils/compress.py

và đây là một wrapper để nén một lớp cụ thể của chuỗi: (hồ sơ JSON ngắn)

https://github.com/internetarchive/openlibrary/blob/master/openlibrary/utils/olcompress.py

Một bắt: để làm điều này hiệu quả, thư viện nén của bạn phải hỗ trợ 'nhân bản' trạng thái bên trong. (Thư viện Python có) Bạn có thể thực hiện một cái gì đó tương tự bằng cách thêm trước văn bản ví dụ khi nén, nhưng điều này có nghĩa là phải trả thêm chi phí tính toán.

Nhờ solrize cho mẹo tuyệt vời này.

Các vấn đề liên quan