Trong nội bộ, Redis lưu trữ các chuỗi theo cách hiệu quả nhất. Việc buộc các số nguyên thành chuỗi cơ số 10 sẽ thực sự sử dụng nhiều bộ nhớ hơn.
Đây là cách Redis lưu trữ Chuỗi -
- Các số nguyên nhỏ hơn 10000 được lưu trữ trong nhóm bộ nhớ dùng chung và không có bất kỳ chi phí bộ nhớ nào. Nếu muốn, bạn có thể tăng giới hạn này bằng cách thay đổi hằng số REDIS_SHARED_INTEGERS trong redis.h và biên dịch lại Redis.
- Các số nguyên lớn hơn 10000 và trong phạm vi dài tiêu thụ 8 byte.
- Các chuỗi thông thường lấy len (string) + 4 byte cho độ dài + 4 byte để đánh dấu không gian trống + 1 byte cho dấu chấm dứt rỗng + 8 byte cho các chi phí chung malloc.
Trong ví dụ bạn đã trích dẫn, đó là một câu hỏi 8 byte cho v / s dài 21 byte cho chuỗi.
CHỈNH SỬA:
Vì vậy, nếu tôi có một tập hợp tất cả các số nhỏ hơn 10.000, làm cách nào Redis lưu trữ tập hợp của tôi?
Nó phụ thuộc vào số lượng yếu tố bạn có.
Nếu bạn có ít hơn 512 phần tử trong tập hợp của mình (xem set-max-intset-entries
), sau đó tập hợp sẽ được lưu trữ dưới dạng IntSet. IntSet là một cái tên được tôn vinh cho một Mảng số nguyên được sắp xếp. Vì các số của bạn nhỏ hơn 10000 nên nó sẽ sử dụng 16 bit cho mỗi phần tử. Nó (gần như) hiệu quả về bộ nhớ như một mảng C.
Nếu bạn có nhiều hơn 512 phần tử, tập hợp sẽ trở thành một HashTable. Mỗi phần tử trong tập hợp được bao bọc trong một cấu trúc được gọi là robj
, có tổng chi phí là 16 byte. robj
cấu trúc có một con trỏ đến nhóm số nguyên được chia sẻ, vì vậy bạn không phải trả thêm bất kỳ khoản nào cho chính số nguyên đó. Và cuối cùng, robj
các phiên bản được lưu trữ trong bảng băm và bảng băm có chi phí tương ứng với kích thước của tập hợp.
Nếu bạn quan tâm đến chính xác lượng bộ nhớ mà một phần tử sử dụng, hãy chạy redis-rdb-tools trên tập dữ liệu của bạn (tuyên bố từ chối trách nhiệm:Tôi là tác giả của công cụ này). Hoặc bạn có thể đọc mã nguồn của lớp MemoryCallback, các nhận xét giải thích cách bố trí bộ nhớ.