2012-11-06 15 views
12

Thực ra, tôi có 3 phiên bản Redis và tôi đặt chúng lại với nhau thành 500MB + dump.rdb này. Máy chủ Redis có thể đọc dump.rdb này và dường như mọi thứ đều ổn. Sau đó, tôi nhận thấy rằng redis-server có giá hơn 5.0GB bộ nhớ. Tôi không biết tại sao.Tại sao tệp kết xuất Redis 500. Redb mất khoảng 5.0GB bộ nhớ?

Có điều gì sai với tệp của tôi không? Db của tôi có khoảng 3 triệu khóa, giá trị cho mỗi khóa là danh sách chứa khoảng 80 số nguyên.

Tôi sử dụng số này METHOD để đặt 3 mẫu cùng nhau.

PS: Một dump.rdb khác có cùng kích thước và cùng cấu trúc khóa-giá trị chỉ tốn 1GB bộ nhớ.

Và dữ liệu của tôi trông giống như keyNum -> {num1, num2, num3, ......}. Tất cả các số là từ 1 đến 4.000.000. Vậy tôi có nên sử dụng Danh sách để lưu trữ chúng không? Bây giờ, tôi sử dụng lpush (k, v). Cách này có tốn kém quá nhiều không?

Trả lời

0

Có thể có nhiều hơn với nó, nhưng tôi tin Redis nén tệp kết xuất.

+0

Có nó nén dữ liệu. 500MB đến 5.0GB, tôi không thể khởi chạy chương trình của mình ngay bây giờ :-( – wyp

15

Tỷ lệ bộ nhớ để loại bỏ kích thước phụ thuộc vào loại dữ liệu mà Redis sử dụng trong nội bộ.

Đối với các đối tượng nhỏ (băm, danh sách và sắp xếp), redis sử dụng ziplists để mã hóa dữ liệu. Đối với các bộ nhỏ được làm bằng số nguyên, redis sử dụng Intsets. ZipLists và IntSets được lưu trữ trên đĩa ở định dạng giống như chúng được lưu trữ trong bộ nhớ. Vì vậy, bạn mong đợi tỷ lệ 1: 1 nếu dữ liệu của bạn sử dụng các mã hóa này.

Đối với các đối tượng lớn hơn, biểu diễn trong bộ nhớ hoàn toàn khác với biểu diễn trên đĩa. Định dạng trên đĩa được nén, không có con trỏ, không phải xử lý phân mảnh bộ nhớ. Vì vậy, nếu các đối tượng của bạn là lớn, một bộ nhớ 10: 1 để tỷ lệ đĩa là bình thường và dự kiến.

Nếu bạn muốn biết đối tượng nào ăn hết bộ nhớ, hãy sử dụng redis-rdb-tools để cấu hình dữ liệu của bạn. Từ đó, hãy theo dõi memory optimization notes on redis.io, cũng như memory optimization wiki entry on redis-rdb-tools.

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