Secara internal, Redis menyimpan string dengan cara yang paling efisien. Memaksa bilangan bulat menjadi string radix 10 sebenarnya akan menggunakan lebih banyak memori.
Inilah cara Redis menyimpan Strings -
- Bilangan bulat yang kurang dari 10.000 disimpan dalam kumpulan memori bersama, dan tidak memiliki overhead memori. Jika mau, Anda dapat meningkatkan batas ini dengan mengubah konstanta REDIS_SHARED_INTEGERS di redis.h dan mengkompilasi ulang Redis.
- Bilangan bulat yang lebih besar dari 10.000 dan dalam rentang waktu yang lama mengkonsumsi 8 byte.
- String biasa mengambil len(string) + 4 byte untuk panjangnya + 4 byte untuk menandai ruang kosong + 1 byte untuk null terminator + 8 byte untuk overhead malloc.
Dalam contoh yang Anda kutip, pertanyaannya adalah 8 byte untuk panjang v/s 21 byte untuk string.
EDIT :
Jadi, jika saya memiliki kumpulan angka yang semuanya kurang dari 10.000, bagaimana Redis menyimpan kumpulan saya?
Itu tergantung pada berapa banyak elemen yang Anda miliki.
Jika Anda memiliki kurang dari 512 elemen di set Anda (lihat set-max-intset-entries
), maka set tersebut akan disimpan sebagai IntSet. IntSet adalah nama yang dimuliakan untuk Array Integer Terurut. Karena angka Anda kurang dari 10.000, itu akan menggunakan 16 bit per elemen. Ini (hampir) seefisien memori seperti array C.
Jika Anda memiliki lebih dari 512 elemen, kumpulan tersebut menjadi HashTable. Setiap elemen dalam himpunan dibungkus dalam struktur yang disebut robj
, yang memiliki overhead 16 byte. robj
struktur memiliki penunjuk ke kumpulan bilangan bulat bersama, jadi Anda tidak perlu membayar ekstra untuk bilangan bulat itu sendiri. Dan akhirnya, robj
instance disimpan dalam hashtable, dan hashtable memiliki overhead yang sebanding dengan ukuran set.
Jika Anda tertarik dengan berapa banyak memori yang dikonsumsi suatu elemen, jalankan redis-rdb-tools pada dataset Anda (penafian:Saya adalah pembuat alat ini). Atau Anda dapat membaca kode sumber untuk kelas MemoryCallback, komentar menjelaskan bagaimana memori diletakkan.