Rumah > Artikel > pangkalan data > Bagaimana untuk memastikan konsistensi dua tulis antara Redis dan MySQL? (Meituan Ermian)
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 masalah ketidakkonsistenan data. Bagaimanakah kita biasanya menggunakan cache? Terdapat tiga corak caching klasik:
Cache-Aside Pattern, iaitu bypass cache mod, dicadangkan untuk menyelesaikan masalah ketidakkonsistenan data antara cache dan pangkalan data sebanyak mungkin.
Proses permintaan baca Corak Cache-Aside adalah seperti berikut:
Corak Cache-AsideProses permintaan tulis adalah seperti berikut:
Apabila mengemas kini, mula-mula kemas kini pangkalan data dan kemudian padamkan cache .
Read/Write Through mod, pelayan menggunakan cache sebagai storan data utama. Interaksi antara aplikasi dan cache pangkalan data diselesaikan melalui lapisan cache abstrak.
Baca-TerusProses ringkasnya adalah seperti berikut
Adakah proses ringkas ini hampir sama dengan Cache-Aside? Sebenarnya, Baca-Terus hanyalah lapisan tambahan Penyedia 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 oleh lapisan abstraksi cache Proses kemas kini adalah seperti berikut:
Tulis di belakang (tulisan cache tak segerak)Tulis di belakang dan Baca-Terus/Tulis-Terus Terdapat persamaan, bertanggungjawab untuk caching dan membaca dan menulis pangkalan data. Terdapat perbezaan besar antara mereka: Cache Provider
Baca/Tulis Melalui mengemas kini cache dan data secara serentak, manakala Tulis Di Belakang hanya mengemas kini cache dan tidak mengemas kini pangkalan data secara langsung Melalui Cara asynchronous untuk mengemas kini pangkalan data.
Sistem dengan keperluan konsistensi tinggi harus digunakan dengan berhati-hati . Tetapi ia sesuai untuk senario penulisan yang kerap Mekanisme Kolam Penampan InnoDB MySQL 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, mengapakah memadamkan 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 baharu tidak konsisten dan data kotor muncul . Jika ia memadamkan 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 ia mengendalikan pangkalan data terlebih dahulu? Mengapa tidak mengendalikan cache dahulu?
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 strategi Cache Delayed Double Delete strategi? 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 ada pemadaman berganda tertunda atau operasi 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 memperkenalkan untuk memadamkan mekanisme Cuba semula
Mekanisme cache pemadaman cuba semula tidak mengapa, tetapi ia akan menyebabkan banyak pencerobohan kod perniagaan. Malah, anda juga boleh menghapuskan kunci secara 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!