Đoạn mã Java sau đây chèn một triệu cặp số nguyên vào Redis.
lớp công khai JedisInsertion {
byte tĩnh công khai [] fromInt(int v) {
return ByteBuffer.allocate(4).putInt(v).array();
}
public static void main(String args[]) {
Jedis j = Jedis mới("localhost");
cho (int i = 0;i<1000*1000;i++){
j.set(fromInt(i),fromInt(i));
}
}
}
Đây là đầu ra thông tin redis
...
used_memory:89319664
Arch_bits:64
...
89319664 có nghĩa là khoảng 89 byte cho mỗi cặp khóa-giá trị.
Tôi đã mong đợi khoảng 8 MB (khóa 4 byte + giá trị 4 byte).
Tôi cũng đã biên dịch redis ở chế độ 32 bit (vẫn chạy máy thử nghiệm trên 64 bit).
Kết quả của phiên bản redis 32 bit:
Bộ nhớ đã sử dụng: 68831664 => 68 byte cho mỗi cặp khóa-giá trị.
Cả hai kết quả đều cao hơn tôi mong đợi nhiều lần.
Khi tôi xem redis bằng CLI, tôi thấy một khóa thông thường trông như thế này: "\x00\x00\xc2\xff"
Cảm ơn phản hồi của bạn
Tái bút - Tôi đang sử dụng Redis 2.2.14 và Jedis 2.0 trên máy 64 bit
PSS - Tôi cũng đã thử lưu trữ tất cả các giá trị trong hàm băm như một trong những nhận xét được đề xuất, đây là mã:
cho (int i = 0;i<1000*1000;i++){
j.hset("my-hash".getBytes(),fromInt(i),fromInt(i));
}
Kết quả như sau:
used_memory_rss:84676608 (dành cho bản dựng 32 bit)
used_memory:105319712 (dành cho bản dựng 64bit)
Khi tôi sử dụng một hàm băm duy nhất, kết quả sẽ tệ hơn.
68 byte cho mỗi loại khóa/giá trị là chính xác. Redis không lưu trữ mọi thứ dưới dạng tệp văn bản thuần túy bên trong, nếu không, nó sẽ không thể tra cứu nhanh chóng, có các loại đối tượng khác nhau, v.v. Có một chi phí liên quan. Có thêm thông tin trong tài liệu trên Redis.io.
Tôi là một lập trình viên xuất sắc, rất giỏi!