Pada bulan April, seorang rakan pergi ke Meituan untuk temu duga Dia berkata dia ditanya bagaimana untuk memastikan konsistensi dwi-tulisan antara Redis dan MySQL? Soalan ini sebenarnya bertanya bagaimana untuk memastikan konsistensi cache dan pangkalan data dalam senario dua tulis? Artikel ini akan membincangkan dengan anda cara menjawab soalan ini.
Ketekalan bermaksud data kekal konsisten Dalam sistem teragih, ia boleh difahami sebagai nilai data dalam berbilang nod adalah konsisten.
Caching boleh meningkatkan prestasi dan melegakan tekanan pangkalan data, tetapi menggunakan cache juga boleh menyebabkan masalahketidakkonsistenandata. Bagaimanakah kita biasanya menggunakan cache? Terdapat tiga corak caching klasik:
Cache-Aside Pattern, iaitubypass cache mod, dicadangkan untuk menyelesaikan masalah ketidakkonsistenan data antara cache dan pangkalan data sebanyak mungkin.
Proses permintaan baca Corak Cache-Asideadalah seperti berikut:
Corak Cache-AsideProses permintaan tulis adalah seperti berikut:
Apabila mengemas kini, mula-mulakemas kini pangkalan data dan kemudian padamkan cache.
Read/Write Throughmod, pelayan menggunakan cache sebagai storan data utama. Interaksi antara aplikasi dan cache pangkalan data diselesaikan melaluilapisan cache abstrak.
Baca-TerusProses ringkasnya adalah seperti berikut
Adakah proses ringkas ini hampir sama denganCache-Aside? Sebenarnya,Baca-Terushanyalah lapisan tambahanPenyedia Cache, dan prosesnya adalah seperti berikut:
Baca Lalu sebenarnya hanyalah Cache-Aside, yang akan menjadikan kod program lebih ringkas dan mengurangkan beban pada sumber data. Mod
Tulis-TerusTulis-Terus, apabila permintaan tulis berlaku, sumber data dan data cache turut dilengkapkan olehlapisan abstraksi cacheProses kemas kini adalah seperti berikut:
Tulis di belakang (tulisan cache tak segerak)Tulis di belakangdanBaca-Terus/Tulis-TerusTerdapat persamaan,bertanggungjawab untuk caching dan membaca dan menulis pangkalan data. Terdapat perbezaan besar antara mereka:Cache Provider
Baca/Tulis Melaluimengemas kini cache dan data secara serentak, manakalaTulis Di Belakanghanya mengemas kini cache dan tidak mengemas kini pangkalan data secara langsung MelaluiCara asynchronousuntuk mengemas kini pangkalan data.
Sistem dengan keperluan konsistensi tinggi harus digunakan dengan berhati-hati. Tetapi ia sesuai untuk senario penulisan yang kerapMekanisme Kolam Penampan InnoDBMySQL menggunakan mod ini.
Apabila mengendalikan cache, patutkah anda memadamkan cache atau mengemas kini cache? Dalam senario perniagaan umum, kami menggunakan modCache-Aside. Sesetengah rakan mungkin bertanya,Cache-AsideApabila menulis permintaan, mengapakahmemadamkan cache dan bukannya mengemas kini cache?
Apabila kami mengendalikan cache, patutkah kami memadamkan cache atau mengemas kini cache? Mari lihat contoh dahulu:
Pada masa ini, cache menyimpan data A (data lama), dan pangkalan data menyimpan data B (data baharutidak konsistendan data kotor muncul . Jika iamemadamkan cache dan bukannya mengemas kini cache, masalah data kotor ini tidak akan berlaku.
Mengemas kini cache mempunyai dua kelemahan berbanding pemadaman cache:
Cache-Aside
Dalam mod cache, sesetengah rakan masih mempunyai soalan semasa menulis permintaan, mengapakah iamengendalikan pangkalan data terlebih dahulu? Mengapatidak mengendalikan cachedahulu?
Andaikan terdapat dua permintaan, A dan B, meminta A untuk melakukan operasi kemas kini dan meminta B untuk melakukan pertanyaan dan operasi membaca.
Jiang Zi ada masalah La,Data cache dan pangkalan data tidak konsisten. Cache menyimpan data lama, dan pangkalan data menyimpan data baharu. Oleh itu,Cache-Aside
mod cache memilih untuk mengendalikan pangkalan data dahulu dan bukannya cache dahulu.
Sesetengah rakan mungkin mengatakan bahawa anda tidak perlu mengendalikan pangkalan data dahulu, hanya gunakan strategiCache Delayed Double Deletestrategi? Apakah pemadaman berganda tertunda?
Berapa lama biasanya masa yang diambil untuk tidur seketika? Adakah mereka semua 1 saat?
Masa tidur ini = masa yang diperlukan untuk membaca data logik perniagaan + beberapa ratus milisaat. Untuk memastikan permintaan baca tamat, permintaan tulis boleh memadamkan data kotor cache yang mungkin dibawa oleh permintaan baca.
Sama adapemadaman berganda tertundaatauoperasi pertama pangkalan data Cache-Aside dan kemudian pemadaman cache, Jika langkah kedua pemadaman cache gagal, kegagalan pemadaman akan mengakibatkan data kotor~
Jika pemadaman gagal, padamkannya beberapa kali untuk memastikan pemadaman cache berjaya~ Jadi anda boleh memperkenalkanuntuk memadamkan mekanisme Cuba semula
Mekanisme cache pemadaman cuba semula tidak mengapa, tetapi ia akan menyebabkan banyak pencerobohan kod perniagaan. Malah, anda juga boleh menghapuskan kuncisecara tak segerak melalui binlog pangkalan data.
Mengambil mysql sebagai contoh, anda boleh menggunakan saluran Alibaba untuk mengumpul log binlog dan menghantarnya ke baris gilir MQ, dan kemudian mengesahkan dan memproses mesej kemas kini melalui mekanisme ACK , padamkan cache dan pastikan data Cache konsisten
Pembelajaran yang disyorkan: " Tutorial Video Redis"Atas ialah kandungan terperinci Bagaimana untuk memastikan konsistensi dua tulis antara Redis dan MySQL? (Meituan Ermian). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!