Rumah > pangkalan data > Redis > Penjelasan tentang prinsip strategi pemadaman kunci Redis yang telah tamat tempoh

Penjelasan tentang prinsip strategi pemadaman kunci Redis yang telah tamat tempoh

WBOY
Lepaskan: 2022-09-02 20:55:20
ke hadapan
2264 orang telah melayarinya

Pembelajaran yang disyorkan: Tutorial video Redis

Pelayan Redis sebenarnya menggunakan dua strategi: pemadaman malas dan pemadaman biasa: melalui kerjasama Menggunakan ini dua strategi pemadaman, pelayan boleh mencapai keseimbangan yang baik antara penggunaan rasional masa CPU dan mengelakkan ruang memori yang terbuang.

Pemadaman malas

Strategi pemadaman malas adalah yang paling mesra kepada masa CPU: program hanya akan menyemak kekunci untuk tamat tempoh apabila kunci dikeluarkan, yang boleh memastikan operasi pemadaman kunci tamat tempoh hanya Ia akan dilakukan apabila ia mesti dilakukan, dan sasaran pemadaman terhad kepada kunci yang sedang diproses Strategi ini tidak akan menghabiskan sebarang masa CPU untuk memadam kunci tamat tempoh yang tidak berkaitan.

Kelemahan strategi pemadaman malas ialah ia paling tidak mesra ingatan: jika kunci telah tamat tempoh, dan kunci masih disimpan dalam pangkalan data, maka selagi kunci tamat tempoh tidak dipadamkan, ia akan menduduki Memori tidak akan dilepaskan.

Apabila menggunakan strategi pemadaman malas, jika terdapat banyak kunci tamat tempoh dalam pangkalan data, dan kunci tamat tempoh ini kebetulan tidak dapat diakses, maka kunci tersebut mungkin tidak akan dipadamkan (melainkan pengguna melaksanakan FLUSHDB secara manual ), kita juga boleh menganggap situasi ini sebagai kebocoran memori - data sampah yang tidak berguna menduduki sejumlah besar memori, tetapi pelayan tidak akan melepaskannya dengan sendirinya Ini adalah masalah untuk pelayan Redis yang status berjalannya sangat bergantung pada memori bukan berita baik.

Contohnya, untuk beberapa data berkaitan masa, seperti log, selepas masa tertentu, akses kepada mereka akan sangat berkurangan, atau bahkan tidak lagi diakses Jika data tersebut telah tamat tempoh Sebilangan besar kunci tertunggak dalam pangkalan data Pengguna berfikir bahawa pelayan telah memadamnya secara automatik, tetapi sebenarnya kunci ini masih wujud, dan memori yang diduduki oleh kekunci itu tidak dilepaskan.

Pemadaman biasa

Daripada perbincangan pemadaman malas di atas, kaedah pemadaman ini mempunyai kelemahan yang jelas apabila digunakan secara bersendirian: ​​

Malas Memadam pembaziran juga banyak ingatan dan risiko kebocoran ingatan. Strategi pemadaman berkala ialah penyepaduan dan kompromi daripada dua strategi pertama:

Strategi pemadaman berkala melaksanakan pemadaman kunci tamat tempoh pada selang masa yang tetap dan mengurangkan operasi pemadaman dengan mengehadkan tempoh dan kekerapan operasi pemadaman masa. Di samping itu, dengan kerap memadamkan kunci tamat tempoh, strategi pemadaman tetap berkesan mengurangkan sisa memori yang disebabkan oleh kunci tamat tempoh. Kesukaran strategi pemadaman berkala adalah untuk menentukan tempoh dan kekerapan operasi pemadaman:

Jika operasi pemadaman dilakukan terlalu kerap, atau masa pelaksanaan terlalu lama, strategi pemadaman berkala akan merosot menjadi strategi pemadaman berjadual, supaya ia akan Terlalu banyak masa CPU dibelanjakan untuk memadam kunci tamat tempoh.

Jika operasi pemadaman dilaksanakan terlalu jarang, atau masa pelaksanaan terlalu singkat, strategi pemadaman biasa akan sama dengan strategi pemadaman malas, mengakibatkan pembaziran memori. Oleh itu, jika strategi pemadaman biasa diguna pakai, pelayan mesti menetapkan secara munasabah tempoh pelaksanaan dan kekerapan operasi pemadaman mengikut situasi.

Strategi pemadaman malas

Strategi pemadaman malas kunci tamat tempoh dilaksanakan oleh fungsi db.c/expireIfNeeded Semua arahan Redis yang membaca dan menulis pangkalan data akan memanggil fungsi expireIfNeeded untuk menyemak kekunci input sebelum pelaksanaan:

Jika kunci input telah tamat tempoh, fungsi expireIfNeeded akan memadamkan kunci input daripada pangkalan data.

Jika kunci input belum tamat tempoh, fungsi expireIfNeeded tidak mengambil tindakan.

Fungsi expireIfNeeded adalah seperti penapis, yang boleh menapis kekunci input yang telah tamat tempoh sebelum perintah itu benar-benar dilaksanakan, dengan itu menghalang arahan daripada menyentuh kekunci yang telah tamat tempoh.

Selain itu, kerana setiap kunci yang diakses boleh dipadamkan oleh fungsi expireIfNeeded kerana tamat tempoh, fungsi pelaksanaan setiap arahan mesti dapat mengendalikan kedua-dua kewujudan kunci dan ketiadaan kunci:

Apabila kunci wujud, arahan itu dilaksanakan seolah-olah kunci itu wujud.

Apabila kunci tidak wujud atau kunci dipadamkan oleh fungsi expireIfNeeded kerana tamat tempoh, arahan itu dilaksanakan seolah-olah kunci itu tidak wujud.

Pelaksanaan strategi pemadaman berkala

Strategi pemadaman berkala bagi kunci tamat tempoh dilaksanakan oleh fungsi redis.c/activeExpireCycle Setiap kali fungsi redis.c/serverCron pelayan Redis dilaksanakan, fungsi activeExpireCycle. akan Apabila dipanggil, ia merentasi setiap pangkalan data dalam pelayan beberapa kali dalam masa yang ditentukan, menyemak secara rawak masa tamat tempoh beberapa kunci daripada kamus tamat tempoh pangkalan data, dan memadamkan kunci tamat tempoh.

Seluruh proses boleh diterangkan dalam kod pseudo seperti berikut

Mod kerja fungsi activeExpireCycle boleh diringkaskan seperti berikut:

Setiap kali fungsi berjalan, ia mengeluarkan sejumlah kunci rawak daripada bilangan pangkalan data tertentu untuk diperiksa dan memadamkan kunci yang telah tamat tempoh.

Pembolehubah global current_db akan merekodkan kemajuan semakan fungsi activeExpireCycle semasa, dan apabila fungsi activeExpireCycle dipanggil seterusnya, kemajuan sebelumnya akan diproses. Sebagai contoh, jika fungsi activeExpireCycle semasa kembali apabila melintasi pangkalan data No. 10, maka pada kali berikutnya fungsi activeExpireCycle dilaksanakan, ia akan mencari dan memadam kekunci tamat tempoh bermula dari pangkalan data No. 11.

Apabila fungsi activeExpireCycle terus dilaksanakan, semua pangkalan data dalam pelayan akan disemak Pada masa ini, fungsi menetapkan semula pembolehubah current_db kepada 0, dan kemudian memulakan pusingan baharu pemeriksaan semula.

Apabila pelayan berjalan dalam mod replikasi, pemadaman kekunci tamat tempoh daripada pelayan hamba dikawal oleh pelayan induk:

Selepas pelayan induk memadamkan kekunci tamat tempoh kekunci, ia akan memaparkan Hantar perintah DEL secara rasmi kepada semua pelayan hamba untuk memberitahu pelayan hamba untuk memadamkan kunci tamat tempoh.

Apabila pelayan hamba melaksanakan perintah baca yang dihantar oleh klien, walaupun ia menemui kunci tamat tempoh, ia tidak akan memadamkan kunci tamat tempoh, tetapi akan terus memproses kunci tamat tempoh seperti kunci belum tamat tempoh

Pelayan hamba akan memadamkan kunci tamat tempoh hanya selepas menerima arahan DEL daripada pelayan induk.

Dengan mengawal pelayan induk untuk memadamkan kunci tamat tempoh secara seragam daripada pelayan hamba, ketekalan data pelayan induk-hamba dapat dipastikan Atas sebab ini apabila kunci tamat tempoh masih wujud dalam pangkalan data pelayan induk, Replika kunci tamat tempoh ini dalam pelayan hamba juga akan terus wujud. Sebagai contoh, terdapat sepasang pelayan tuan-hamba, dan pangkalan data mereka semua menyimpan mesej tiga kunci yang sama, xxx, dan yyy, di mana mesej ialah kunci tamat tempoh, seperti yang ditunjukkan dalam rajah.

Jika pelanggan menghantar arahan GET mesej kepada pelayan hamba pada masa ini, pelayan hamba akan mendapati bahawa kunci mesej telah tamat tempoh, tetapi pelayan hamba tidak akan memadam kunci mesej. Ia adalah untuk terus mengembalikan nilai kunci mesej kepada klien, seolah-olah kunci mesej belum tamat tempoh

Anggapkan bahawa selepas ini, pelanggan menghantar arahan GET mesej ke pelayan utama , kemudian pelayan induk akan mendapati bahawa mesej utama telah tamat tempoh: pelayan induk akan memadamkan kunci mesej, mengembalikan balasan kosong kepada klien dan menghantar arahan mesej DEL

ke pelayan hamba Selepas menerima arahan mesej DEL daripada pelayan induk, kunci mesej juga akan dipadamkan daripada pangkalan data Selepas itu, pelayan induk dan hamba tidak akan disimpan lagi mesej utama yang telah tamat tempoh

Pembelajaran yang disyorkan: Tutorial video Redis

Atas ialah kandungan terperinci Penjelasan tentang prinsip strategi pemadaman kunci Redis yang telah tamat tempoh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:jb51.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan