Mari kita lihat dahulu bagaimana proses caching biasa ini? Seperti yang ditunjukkan dalam rajah di bawah:
Anda boleh melihat bahawa pertama sekali pengguna mengakses sesuatu ini, dan kemudian sesuatu ini mengakses Redis Jika Redis mempunyai data akses, ia akan Terus mengembalikan data yang diperoleh daripada cache; jika data tidak ditemui dalam cache Redis, ia akan disoal dalam pangkalan data MySql Jika ada keputusan, data yang ditemui dari MySql akan disegerakkan ke cache Redis, dan pertanyaan. akan Hasilnya dikembalikan.
Ini adalah proses caching yang mudah dan biasa. Oleh itu, mari kita lihat apa runtuhan cache berdasarkan proses caching biasa ini.
Pertama sekali, izinkan saya memberi anda contoh Semasa Double Eleven, apabila anda membeli-belah di Dongdong, anda memasuki halaman utamanya Memandangkan ia adalah Double Eleven, bilangan lawatan ke halaman utama adalah sangat besar. jadi halaman utama Banyak data dicache dalam redis.
Andaikan bahawa data halaman utama disimpan dalam 100 kekunci dalam redis, dan masa tamat tempoh cache ditetapkan kepada dua jam Semasa Double Eleven, selepas membeli-belah selama lebih daripada dua jam, cache redis data halaman utama adalah di sini Semua akan gagal dalam sekelip mata, menyebabkan semua permintaan dipukul ke pangkalan data MySql Pada masa ini, tekanan capaian pangkalan data meningkat, menyebabkan pangkalan data MySql gagal bertindak balas dalam masa dan akibatnya, laman utama Dongdong tidak dapat terus menyediakan perkhidmatan kepada dunia luar, dan kemudian Saudara Dong menjadi sangat tidak berpuas hati dan menghantar orang teknikal yang bertanggungjawab pada masa ini ke Afrika.
Jadi melalui contoh ini, mari kita lihat gambar berikut:
Maksudnya, apabila pengguna mengakses sesuatu, sejumlah besar kunci masuk redis akan menjadi tidak sah, menyebabkan This Dong mengakses pangkalan data secara langsung dan menghantar sejumlah besar permintaan ke pangkalan data Fenomena ini ialah cache avalanche. Ringkasnya, sejumlah besar cache redis tidak sah pada masa yang sama, sama seperti runtuhan salji ini akan datang.
Jadi apakah penyelesaian untuk cache avalanche? Mari kita bincangkan di bawah:
Tetapkan masa tamat tempoh cache ini untuk mengelakkan sebilangan besar kunci daripada menjadi tidak sah pada masa yang sama, iaitu semasa menyediakan cache ini , anda boleh menetapkan masa tamat tempoh kekunci Masa tersebar .
Kami menggunakan redis secara amnya dalam kelompok Kami boleh meletakkan kunci titik panas ini pada nod yang berbeza supaya kunci titik panas ini diagihkan sama rata pada nod redis yang berbeza. Naik .
Terdapat juga kaedah yang lebih ganas, iaitu tidak menetapkan masa tamat tempoh cache, supaya kunci tidak akan tamat tempoh .
Seterusnya kami akan memperkenalkan apa itu penembusan cache.
Mari kita berikan contoh: Sebagai contoh, seorang lelaki tua membangunkan laman web, dan kemudian laman web itu menjadi sangat popular Pada suatu hari, ia tiba-tiba diserang oleh penggodam secara gila-gila . Prinsip ketelusan.
Semua orang tahu bahawa biasanya, kunci utama pangkalan data meningkat daripada 0, dan tiada nombor negatif Jadi penggodam ini mengambil kesempatan daripada ini. Lelaki ini mula-mula meletakkan semua data tapak web ke dalam cache redis, tetapi penggodam menggunakan nombor dengan ID kurang daripada sifar untuk memintanya. Cache redis tidak mempunyai data ini dengan ID kurang daripada sifar, jadi redis tidak boleh Hasilnya, apabila redis tidak dapat mencari hasilnya, ia akan menyemaknya dalam pangkalan data, kemudian semua permintaan akan dipukul ke pangkalan data, dan akan sentiasa dipukul ke pangkalan data, kerana lapisan cache redis tidak boleh memintas data tersebut sama sekali.
Cache redis ditembusi terus oleh data ini, terus menembusi pangkalan data. Begitu juga, mari kita lihat gambar berikut:
Pertama, pengguna yang berniat jahat mengakses sesuatu dan meminta data dengan id=-1, dan kemudian data dengan id=-1 adalah Jika ia tidak ditemui dalam cache redis, saya pergi ke pangkalan data untuk menanyakannya Data itu tidak dijumpai, jadi saya hanya boleh mengembalikan data kosong ke bahagian hadapan.
Pengguna berniat jahat ini (penggodam) menggunakan skrip untuk menghantar data ini secara berterusan untuk meminta, menembusi secara terus dan memukul pangkalan data Ini adalah apa yang dipanggil penembusan cache. Secara ringkasnya, penembusan cache bermakna tiada data sedemikian dalam cache atau pangkalan data Secara amnya, keadaan ini tidak diakses oleh pengguna biasa.
Kemudian penyelesaian untuk penembusan cache adalah seperti berikut:
Jika permintaan itu menembusi redis dan pergi terus ke pangkalan data, maka tidak kira apa keputusan yang ditemui dalam pangkalan data , ditulis kembali ke cache redis, supaya apabila permintaan seterusnya dihantar dengan parameter yang sama, ia akan dipintas terus oleh cache redis dan tidak akan dihantar semula ke pangkalan data .
Sahkan kesahihan parameter yang diminta.
Kaedah yang lebih langsung, mudah dan kasar ialah menyekat IP ini .
Akhir sekali, gunakan penapis mekar, yang merupakan cara yang sangat baik .
Mari kita bincangkan tentang isu terakhir, iaitu pecahan cache.
Mari kita ambil Double Eleven sebagai contoh: Semasa Double Eleven, Abang Dong mengumumkan bahawa dia ingin mengadakan acara besar dan berkata bahawa dia ingin melelong komputer yang digunakannya 20 tahun lalu, dan terdapat banyak orang yang saya berminat dengan komputer ini, jadi Dong Ge memutuskan untuk melelong komputer pada pukul 9 pada Double Eleven Kemudian pengaturcara pembangunan Dong meletakkan data komputer ke dalam cache redis, yang sepadan dengan kunci dalam cache redis.
Semasa lelongan, semua orang sangat bersemangat Lelongan berlangsung selama hampir tiga jam Lelongan dalam talian masih belum tamat, tetapi masa tamat tempoh kunci cache redis yang sepadan dengan komputer ini adalah tiga setengah hari. Jam. Apabila semua orang melelong selama tiga setengah jam, kunci cache komputer ini tiba-tiba menjadi tidak sah Akibatnya, sebilangan besar permintaan lelongan tidak dapat menjumpai data dalam redis, jadi sebilangan besar permintaan ini terus dipukul. pangkalan data Pada masa ini, pangkalan data Tekanan serta-merta meningkat, menyebabkan sistem gagal bertindak balas dalam masa dan menutup telefon.
Ketika ini, Abang Dong agak marah apabila melihat komputernya masih belum dilelong, lalu dia menghantar pengaturcara ke Afrika.
Begitu juga, mari lihat gambar berikut:
Pengguna melawat tapak web tertentu, dan kemudian pergi ke redis untuk meminta produk jualan kilat lelongan. Tiada pembatalan dalam cache Pada masa ini, redis boleh mengembalikan hasil kunci cache yang ditanya, tetapi apabila kunci cache menjadi tidak sah, permintaan akan menembusi redis dan memukul pangkalan data secara langsung.
Apa yang perlu diberi perhatian oleh semua orang di sini ialah ini adalah kunci tempat liputan tertentu Sebilangan besar pengguna meminta untuk mengakses kunci tempat liputan ini secara berterusan Apabila kunci tempat liputan ini tiba-tiba tidak sah, semua permintaan akan disekat Kepada pangkalan data, proses ini dipanggil pecahan cache. Ingat ia adalah kunci untuk menembusi tempat yang sangat panas.
Maka penyelesaian kepada pecahan cache ini ialah:Biar kunci tempat liputan ini tidak luput, iaitu, jangan tetapkan masa tamat tempoh (tidak disyorkan) .
Gunakan kunci yang diedarkan Jika ia adalah satu aplikasi, gunakan kunci mutex (kunci yang diedarkan akan dibincangkan dalam artikel seterusnya) .
Atas ialah kandungan terperinci Apakah mata pengetahuan asas baris gilir mesej Java MQ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!