Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Redis 10x lebih banyak penggunaan memori daripada data

Nah ini yang diharapkan dari penyimpanan data yang efisien:kata-kata harus diindeks dalam memori dalam struktur data dinamis sel yang dihubungkan oleh pointer. Ukuran struktur metadata, pointer dan pengalokasi memori fragmentasi internal adalah alasan mengapa data mengambil lebih banyak memori daripada file datar yang sesuai.

Set Redis diimplementasikan sebagai tabel hash. Ini termasuk:

  • susunan pointer yang tumbuh secara geometris (pangkat dua)
  • array kedua mungkin diperlukan saat pengulangan inkremental aktif
  • sel daftar tertaut tunggal yang mewakili entri dalam tabel hash (3 pointer, 24 byte per entri)
  • Pembungkus objek Redis (satu per nilai) (16 byte per entri)
  • data aktual itu sendiri (masing-masing diawali dengan 8 byte untuk ukuran dan kapasitas)

Semua ukuran di atas diberikan untuk implementasi 64 bit. Dengan memperhitungkan overhead pengalokasi memori, ini mengakibatkan Redis mengambil setidaknya 64 byte per item yang ditetapkan (di atas data) untuk versi terbaru Redis menggunakan pengalokasi jemalloc (>=2.4)

Redis menyediakan pengoptimalan memori untuk beberapa tipe data, tetapi tidak mencakup kumpulan string. Jika Anda benar-benar perlu mengoptimalkan konsumsi memori set, ada trik yang dapat Anda gunakan. Saya tidak akan melakukan ini hanya dengan 160 MB RAM, tetapi jika Anda memiliki data yang lebih besar, inilah yang dapat Anda lakukan.

Jika Anda tidak memerlukan kemampuan gabungan, persimpangan, perbedaan set, maka Anda dapat menyimpan kata-kata Anda di objek hash. Manfaatnya adalah objek hash dapat dioptimalkan secara otomatis oleh Redis menggunakan zipmap jika ukurannya cukup kecil. Mekanisme zipmap telah digantikan oleh ziplist di Redis>=2.6, tetapi idenya sama:menggunakan struktur data serial yang dapat ditampung dalam cache CPU untuk mendapatkan kinerja dan jejak memori yang ringkas.

Untuk menjamin objek hash cukup kecil, data dapat didistribusikan menurut beberapa mekanisme hashing. Dengan asumsi Anda perlu menyimpan 1 juta item, menambahkan kata dapat diterapkan dengan cara berikut:

  • hash modulo 10000 (dilakukan di sisi klien)
  • Kata-kata HMSET:[hashnum] [kata] 1

Alih-alih menyimpan:

words => set{ hi, hello, greetings, howdy, bonjour, salut, ... }

Anda dapat menyimpan:

words:H1 => map{ hi:1, greetings:1, bonjour:1, ... }
words:H2 => map{ hello:1, howdy:1, salut:1, ... }
...

Untuk mengambil atau memeriksa keberadaan sebuah kata, itu sama (hash dan gunakan HGET atau HEXISTS).

Dengan strategi ini, penghematan memori yang signifikan dapat dilakukan asalkan modulo hash dipilih sesuai dengan konfigurasi zipmap (atau ziplist untuk Redis>=2.6):

# Hashes are encoded in a special way (much more memory efficient) when they
# have at max a given number of elements, and the biggest element does not
# exceed a given threshold. You can configure this limits with the following
# configuration directives.
hash-max-zipmap-entries 512
hash-max-zipmap-value 64

Hati-hati:nama parameter ini telah berubah dengan Redis>=2.6.

Di sini, modulo 10000 untuk 1 juta item berarti 100 item per objek hash, yang akan menjamin bahwa semuanya disimpan sebagai zipmaps/ziplist.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Implementasi pub/sub di nodeJS

  2. Bagaimana menghubungkan kembali klien redis setelah server redis reboot/skala

  3. fungsi siaran socket.io &arsitektur Redis pub/sub

  4. Redis mencoba terhubung ke localhost di Heroku alih-alih REDIS_URL

  5. Bagaimana cara menggunakan redis untuk menyimpan data hierarkis?