Rumah  >  Artikel  >  pangkalan data  >  Bagaimana Redis menjimatkan memori

Bagaimana Redis menjimatkan memori

王林
王林ke hadapan
2023-05-31 20:04:15571semak imbas

Pertama sekali, aplikasi yang menyemak UID pengguna melalui ID bergambar ini mempunyai keperluan berikut:

  • Kelajuan pertanyaan mestilah cukup pantas

  • Semua data mesti disimpan dalam ingatan, sebaik-baiknya model memori tinggi EC2 (17GB atau 34GB, 68GB terlalu membazir)

  • Sokong isasi kegigihan, supaya tidak perlu untuk memanaskan badan selepas pelayan dimulakan semula

Pertama sekali, mereka menolak penyelesaian penyimpanan pangkalan data Mereka mengekalkan prinsip KISS (Keep It Simple and Stupid), kerana aplikasi ini tidak menggunakan Tiada fungsi kemas kini, fungsi transaksi, pertanyaan berkaitan dan fungsi hebat pangkalan data yang lain, jadi tidak perlu memilih dan mengekalkan pangkalan data untuk fungsi yang tidak digunakan ini.

Jadi mereka memilih Redis ialah pangkalan data dalam memori yang menyokong kegigihan Semua data disimpan dalam ingatan (lupakan VM), dan pelaksanaan yang paling mudah ialah menggunakan struktur redis A kedai akan lakukan. Seperti ini:

SET media:1155315 939
GET media:1155315
> 939

Antaranya, 1155315 ialah ID gambar dan 939 ialah ID pengguna Kami menggunakan setiap ID gambar sebagai kunci dan uid pengguna sebagai nilai untuk menyimpannya sebagai pasangan nilai kunci. Kemudian mereka menjalankan ujian dan menyimpan data mengikut kaedah di atas 1,000,000 data akan menggunakan memori 70MB, dan 300,000,000 foto akan menggunakan memori 21GB. Berbanding dengan bajet 17GB, ia masih berlebihan.

(NoSQLFan: Sebenarnya, kita boleh melihat titik pengoptimuman di sini. Kita boleh mengalih keluar media yang sama di hadapan nilai kunci dan menyimpan nombor sahaja, supaya panjang kunci dikurangkan dan memori overhed nilai kunci dikurangkan [ Nota: Nilai kunci Redis tidak menukar rentetan kepada nombor, jadi apa yang disimpan di sini hanyalah overhed media: 6 bait ini]. Selepas percubaan, penggunaan memori akan dikurangkan kepada 50MB , dan jumlah penggunaan memori ialah 15GB , ia memenuhi keperluan, tetapi penambahbaikan seterusnya Instagram masih diperlukan)

Jadi pembangun Instagram bertanya kepada Pieter Noordhuis, salah seorang pembangun Redis, tentang pelan pengoptimuman. , dan jawapannya ialah menggunakan struktur Hash. Kaedah khusus adalah untuk membahagikan data dan menggunakan struktur Hash untuk menyimpan setiap segmen Memandangkan struktur Hash akan memampatkan dan menyimpan satu elemen Hash apabila ia kurang daripada nombor tertentu, ia boleh menjimatkan banyak memori. Ini tidak wujud dalam struktur String di atas. Parameter "hash-zipmap-max-enries" dalam fail konfigurasi mengawal nombor tertentu. Selepas percubaan oleh pembangun, apabila hash-zipmap-max-entry ditetapkan kepada 1000, prestasi lebih baik Selepas melebihi 1000, arahan HSET akan menyebabkan penggunaan CPU menjadi sangat besar.

Jadi mereka menukar pelan dan menyimpan data dalam struktur berikut:

HSET "mediabucket:1155" "1155315" "939"
HGET "mediabucket:1155" "1155315"
> "939"

Dengan mengambil empat digit pertama ID gambar 7 digit sebagai nilai utama struktur Hash, ia memastikan setiap Hash dalaman Ia hanya mengandungi kunci 3 digit, iaitu 1,000.

Selepas menjalankan satu lagi eksperimen, didapati hanya 16MB memori digunakan untuk setiap 1,000,000 kekunci. Jumlah penggunaan memori juga telah dikurangkan kepada 5GB, yang memenuhi keperluan aplikasi.

(NoSQLFan: Begitu juga, kita masih boleh mengoptimumkan di sini. Yang pertama ialah menukar nilai kunci struktur Hash kepada nombor tulen, supaya panjang kunci dikurangkan sebanyak 12 bait. Kedua ialah menukar nilai kunci dalam struktur Hash. Nilai subkunci menjadi tiga digit, yang mengurangkan overhed sebanyak 4 bait, seperti yang ditunjukkan di bawah, penggunaan memori akan dikurangkan kepada 10MB, dan jumlah penggunaan memori ialah 3GB)

.
HSET "1155" "315" "939"
HGET "1155" "315"
> "939"

Atas ialah kandungan terperinci Bagaimana Redis menjimatkan memori. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam