Artikel ini akan membincangkan tiga pengecualian cache biasa dalam Redis: penembusan cache, pecahan cache dan runtuhan cache Melaluinya, kami akan membincangkan isu penyimpanan kunci panas di Redis.
Cadangan berkaitan: "Analisis konsistensi cache Redis, penembusan cache, pecahan cache dan isu runtuhan cache bersama-sama "
Penembusan cache, pecahan cache dan avalanche cache adalah isu yang sering perlu dipertimbangkan semasa temu bual Redis dan pembangunan sebenar. Masih ramai yang tidak jelas tentang asal usul, punca dan penyelesaian masalah ini. Malah, kita boleh mencari penyelesaian yang baik untuk ketiga-tiga situasi ini dengan menganalisis prinsip yang dihasilkan dengan teliti. [Cadangan berkaitan: Tutorial Video Redis]
Artikel ini membantu anda memahami dengan cepat tiga masalah ini melalui definisi, kes, bahaya dan penyelesaian.
Saya percaya anda telah melihat banyak penyelesaian kepada ketiga-tiga masalah ini di Internet Adakah sebahagian daripadanya adalah penyelesaian 正确的
yang sama? Artikel ini juga akan menganalisis kelebihan dan kekurangan penyelesaian sedemikian satu demi satu.
Gambar di bawah menunjukkan garis besar kandungan artikel ini, dan artikel itu juga menganalisis dan meringkaskan perkara ini.
Penembusan cache, penembusan cache dan Cache avalanche disebabkan oleh fakta bahawa data dalam cache tidak wujud, menyebabkan pangkalan data digunakan untuk menanyakan data.
Memandangkan data cache tidak wujud, semua permintaan akan pergi ke pangkalan data, yang akan menyebabkan tekanan berlebihan pada pangkalan data atau malah ranap perkhidmatan, menjadikan keseluruhan sistem tidak dapat digunakan.
Definisi: Penembusan cache adalah kerana data yang diminta oleh klien tidak wujud dalam cache , dan kemudian menanyakan pangkalan data Walau bagaimanapun, pangkalan data tidak mempunyai data yang ingin ditanya oleh pelanggan, menyebabkan setiap permintaan melalui operasi pertanyaan pangkalan data. 真正的问题在于该数据本身就是不存在的
.
Contoh: Apabila pelanggan meminta butiran produk, ia membawa ID produk Pada masa ini, ID produk tidak wujud (sama ada dalam cache atau dalam pangkalan data). Akibatnya, setiap kali data produk dengan ID ini diminta, ia akan pergi ke pangkalan data.
Hazard: Memandangkan data yang sepadan dengan parameter yang diminta tidak wujud sama sekali, pangkalan data akan diminta setiap kali, meningkatkan tekanan pada pangkalan data atau perkhidmatan ranap, malah menjejaskan modul perniagaan lain. Ini sering berlaku dengan pengguna 恶意请求
.
Penyelesaian:
1. Cache nilai nol berdasarkan parameter yang diminta. Dan tetapkan masa tamat tempoh untuk nilai ini, anda boleh tetapkan masa menjadi lebih pendek.
2. Gunakan penapis Bloom pertama melalui penapis Bloom Jika ia wujud dalam penapis, tanya pangkalan data dan kemudian tambahkannya pada cache. Jika ia tidak wujud, ia akan kembali secara langsung bahawa data pelanggan tidak wujud.
3. Memandangkan penembusan cache mungkin merupakan permintaan berniat jahat yang dimulakan oleh pengguna, IP pengguna boleh direkodkan dan permintaan IP berniat jahat boleh disekat.
Analisis penyelesaian:
Penyelesaian pertama akan cache nilai kosong untuk kunci yang tidak wujud. Katakan terdapat terlalu banyak permintaan sedemikian, adakah mereka semua akan menetapkan cache nilai nol satu demi satu Pada masa ini, akan terdapat sejumlah besar nilai null cache tidak sah dalam Redis. Dengan mengandaikan bahawa kunci sedemikian ialah ID produk atau artikel, selepas kami menetapkan nilai nol, jika data ditambahkan di latar belakang, kami harus mengemas kini nilai cache yang sepadan dengan ID dan menetapkan masa tamat tempoh yang munasabah.
Penyelesaian kedua juga merupakan penyelesaian yang paling biasa digunakan dalam industri. Kelebihan penapis Bloom ialah ia berdasarkan pelaksanaan Redis, operasi memori dan pelaksanaan asasnya juga sangat menjimatkan memori. Apabila data berjaya ditambahkan di latar belakang, ID data akan ditambahkan pada penapis Bloom dan bahagian hadapan terlebih dahulu melalui penapis Bloom untuk mengesahkan sama ada ia wujud semasa membuat permintaan. Tetapi penapis Bloom juga mempunyai kelemahan, iaitu masalah konflik cincang. Apakah maksud konflik hash di sini? Maksudnya, apabila berbilang ID dicincang, bit cincang yang diperoleh adalah nilai yang sama, yang membawa kepada salah menilai apabila mengesahkan sama ada ia wujud. Ada sesuatu dalam dirinya, tetapi tiada apa-apa dalam hasilnya. 布隆过滤器的一个弊端就是,它说有并不一定有,它说没有就一点是没有的。
Pilihan ketiga ialah untuk memulakan sejumlah besar permintaan untuk pengguna yang sama dalam tempoh masa, mencetuskan mekanisme penembusan cache Pada masa ini, kami boleh memaparkan akses pelanggan. Walau bagaimanapun, jika penyerang melancarkan serangan DDOS, dia tidak dapat mengelak sepenuhnya daripada serangan sedemikian, jadi penyelesaian ini bukanlah penyelesaian yang baik.
Ringkasan rancangan:
Kami mula-mula menambah penyelesaian ketiga pada tahap permintaan, mewujudkan mekanisme pengehadan semasa dan mekanisme senarai hitam IP untuk mengawal beberapa permintaan yang berniat jahat, jika ia adalah salah penilaian, kami boleh melaksanakan operasi seperti nyahsekat IP. . Lapisan cache dilaksanakan menggunakan penyelesaian pertama. Tetapkan masa cache yang munasabah.
Untuk senario perniagaan yang boleh bertolak ansur dengan salah penilaian, anda boleh terus menggunakan penyelesaian kedua. Berasaskan Redis sepenuhnya, mengurangkan kerumitan sistem.
Definisi: Pecahan cache adalah kerana kunci hotspot tidak wujud, menyebabkan pangkalan data menjadi diakses Pertanyaan. Peningkatan tekanan pada pangkalan data. Tekanan ini mungkin seketika atau berpanjangan. 真正的问题在于该key是存在,只是缓存中不存在,导致走数据库操作
.
Contohnya: Terdapat produk popular Apabila melihat butiran produk, pengguna membawa ID produk untuk mendapatkan maklumat terperinci produk. Pada masa ini, data dalam cache telah tamat tempoh, jadi semua permintaan masuk mesti pergi ke pangkalan data untuk membuat pertanyaan.
Hazard: Berbanding dengan penembusan cache, data wujud dalam pangkalan data, tetapi kerana cache telah tamat tempoh, ia perlu pergi ke pangkalan data sekali, dan kemudian menambahnya pada cache, dan permintaan seterusnya akan pergi seperti biasa. Kemudaratan yang dipanggil juga ditujukan kepada peringkat pangkalan data.
Penyelesaian:
1. Untuk permintaan pertama, didapati tiada data dalam cache Pada masa ini, pangkalan data pertanyaan telah ditambahkan pada cache. Dengan cara ini, permintaan seterusnya tidak perlu melalui pertanyaan pangkalan data.
2. Tingkatkan masa tamat logik perniagaan. Apabila menyediakan cache, kita boleh menambah masa tamat tempoh cache. Setiap kali anda membaca, buat pertimbangan Jika masa tamat tempoh kurang daripada masa semasa, cetuskan utas latar belakang, pergi ke pangkalan data untuk menarik data, dan kemudian kemas kini data cache dan masa tamat cache. Malah, prinsipnya adalah untuk memanjangkan tempoh cache untuk cache pada tahap kod.
3. Laksanakan penambahan data pada cache melalui latar belakang. Contohnya, sebelum adegan jualan kilat bermula, inventori produk ditambahkan pada cache, supaya apabila permintaan pengguna datang, ia akan pergi terus ke cache.
4. Tidak pernah tamat tempoh. Apabila menetapkan masa tamat tempoh untuk cache, pastikan ia tidak pernah tamat tempoh. Urutan berasingan dibuka di latar belakang untuk mengekalkan masa tamat tempoh dan kemas kini data cache ini.
Analisis program:
Kunci mutex menjamin bahawa hanya satu permintaan pergi ke pangkalan data, yang merupakan kelebihan. Walau bagaimanapun, untuk sistem teragih, kunci teragih digunakan untuk melaksanakan kunci teragih Pelaksanaan kunci teragih itu sendiri mempunyai kesukaran tertentu, yang meningkatkan kerumitan sistem.
Penyelesaian kedua dilaksanakan dengan menggunakan penyelesaian yang Redis tidak tamat tempoh dan perniagaan tamat tempoh. Ia memastikan bahawa setiap permintaan boleh mendapatkan data, dan pada masa yang sama, benang latar belakang boleh digunakan untuk mengemas kini data. Kelemahannya ialah urutan latar belakang belum selesai mengemas kini data Pada masa ini, data yang diminta adalah data lama, yang mungkin mempunyai kelemahan dalam senario perniagaan dengan keperluan masa nyata yang tinggi.
Penyelesaian ketiga ialah menggunakan pemanasan awal cache dan cache setiap kali ia dimuatkan, yang serupa dengan penyelesaian kedua. Walau bagaimanapun, terdapat juga masalah kemas kini data panas, jadi penyelesaian ini sesuai untuk data yang tidak memerlukan data masa nyata yang tinggi.
Penyelesaian keempat adalah serupa dengan penyelesaian kedua dan ketiga Atas dasar ini, pengoptimuman tertentu telah dibuat, menggunakan urutan tak segerak latar belakang untuk mengemas kini data cache secara aktif. Kesukarannya terletak pada mengawal kekerapan kemas kini.
Ringkasan penyelesaian:
Untuk data dengan keperluan masa nyata yang tinggi, penyelesaian pertama disyorkan, walaupun secara teknikalnya sukar tetapi boleh memproses data dalam masa nyata. Jika sesetengah permintaan menunggu lama, pengecualian boleh dikembalikan dan pelanggan boleh menghantar semula permintaan tersebut.
Untuk data yang tidak memerlukan prestasi masa nyata yang tinggi, pilihan keempat boleh digunakan.
Definisi: Pecahan cache yang dinyatakan sebelum ini adalah disebabkan oleh titik panas tertentu dalam cache. kunci gagal, menyebabkan sejumlah besar permintaan pergi ke pangkalan data. Walau bagaimanapun, salji cache sebenarnya sama, tetapi yang ini lebih serius kebanyakan kunci cache tidak sah, dan bukannya satu atau dua kunci.
Contoh: Dalam sistem e-dagang, data produk di bawah kategori tertentu adalah tidak sah dalam cache. Walau bagaimanapun, banyak permintaan daripada sistem semasa adalah untuk data produk di bawah kategori ini. Ini akan menyebabkan semua permintaan melalui pertanyaan pangkalan data.
Hazard: Disebabkan oleh kemasukan sejumlah besar permintaan dalam sekelip mata, setiap permintaan mesti ditanya dalam pangkalan data. Kemasukan serta-merta trafik ke dalam pangkalan data secara serius meningkatkan beban pada pangkalan data dan dengan mudah boleh menyebabkan lumpuh pangkalan data langsung.
Penyelesaian:
1. Oleh kerana sebilangan besar cache tamat tempoh pada masa tertentu, ini bermakna masa tamat cache agak tertumpu. Kami secara langsung menetapkan masa tamat tempoh menjadi tidak fokus dan rawak. Dengan cara ini, masa tamat tempoh cache tidak akan sangat tertumpu, dan tidak akan terdapat sejumlah besar permintaan kepada pangkalan data untuk operasi pertanyaan pada masa yang sama.
2. Cache pelbagai peringkat. Daripada hanya bergantung pada Redis untuk caching, kita juga boleh menggunakan memcached untuk caching (ini hanya contoh, perkhidmatan caching lain juga boleh digunakan). Apabila menyimpan data, buat cache untuk Redis dan cache untuk memcached. Jika Redis gagal, kita boleh menggunakan memcached.
3. Kunci Mutex. Dalam pecahan cache, kami menyebut penggunaan kunci mutex, dan kami juga boleh menggunakannya dalam kes runtuhan salji.
4. Tetapkan bendera tamat tempoh. Malah, anda juga boleh menggunakan tidak tamat tempoh kekal yang dinyatakan dalam pecahan cache. Apabila meminta, masa tamat tempoh ditentukan Jika masa tamat tempoh menghampiri, bendera tamat tempoh ditetapkan dan urutan bebas dicetuskan untuk mengemas kini cache.
Analisis penyelesaian:
Penyelesaian pertama menggunakan masa caching nombor rawak untuk memastikan masa tamat tempoh kunci tersebar. Kesukarannya terletak pada cara menetapkan masa cache Untuk sesetengah data yang memerlukan masa cache yang singkat dan jumlah data yang sangat besar, penyelesaian ini memerlukan kawalan masa yang munasabah.
Penyelesaian kedua menggunakan cache berbilang peringkat, yang boleh memastikan semua permintaan dicache. Walau bagaimanapun, ini meningkatkan kesukaran seni bina sistem dan pelbagai masalah lain, seperti caching kemas kini berbilang peringkat.
Pilihan ketiga menggunakan kunci mutex.
Penyelesaian keempat menggunakan masa cache logik, yang menjamin tekanan cache sistem dengan baik.
Ringkasan rancangan:
Dalam projek sebenar, adalah disyorkan untuk mencuba pilihan pertama, kedua dan keempat yang akan menjadi lebih baik.
Penembusan cache adalah kerana pangkalan data itu sendiri tidak mempunyai data.
Pecahan cache dan avalanche cache bermakna data wujud dalam pangkalan data, tetapi data dalam cache tidak sah, menyebabkan pangkalan data disoal semula dan kemudian ditambahkan pada cache.
Pecahan cache adalah untuk beberapa kekunci panas, manakala runtuhan cache ialah kegagalan cache berskala besar. Kedua-dua prinsip itu sebenarnya sama, kecuali pembahagian kunci cache adalah berbeza.
Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengenalan kepada Pengaturcaraan! !
Atas ialah kandungan terperinci Analisis isu storan kunci panas dalam Redis dan bincangkan tentang penyelesaian kepada pengecualian cache. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!