Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menyegerakkan data MySQL ke cache Redis

Bagaimana untuk menyegerakkan data MySQL ke cache Redis

王林
王林ke hadapan
2023-05-27 09:08:101351semak imbas

1 Mysql menyemak data dan kemudian menulisnya kepada Redis secara serentak

Kelemahan 1: Ia akan menyebabkan kelewatan pada antara muka, kerana penulisan segerak untuk redis sendiri mempunyai kelewatan, dan cuba semula diperlukan Jika redis menulis gagal, anda perlu mencuba lagi, yang lebih memakan masa.

Kelemahan 2: Tiada penyahgandingan Jika redis ranap, utas akan disekat terus

Kelemahan 3: Jika seseorang adalah pangkalan data, ia tidak akan disegerakkan melainkan pangkalan data yang sepadan. dipadamkan secara manual, tetapi terdapat perbezaan masa dalam proses pemadaman Redis

2 Mysql menyemak data dan menyegerakkan Redis dalam urutan pengguna dengan menghantar MQ

Kelemahan 1: Terdapat lebih banyak lagi lapisan MQ, iaitu, ia akan Terdapat kebarangkalian yang tinggi untuk menyebabkan masalah kelewatan penyegerakan.

Kelemahan 2: Langkah berjaga-jaga mesti diambil untuk ketersediaan MQ

Kelemahan 3: Jika pangkalan data dibuat secara manual, penyegerakan tidak akan dapat dilakukan

Kelebihan 1: Ia dapat mengurangkan masalah kelewatan pengembalian antara muka

Kelebihan 2: MQ sendiri mempunyai mekanisme cuba semula, tidak perlu secara manual tulis kod cuba semula

Kelebihan 3: Penyahgandingan, pertanyaan Mysql dan penyegerakan Redis dipisahkan sepenuhnya dan tidak mengganggu antara satu sama lain

3 Langgan fail Binlog Mysql (boleh dilakukan dengan bantuan Canal )

CanalServer akan berpura-pura menjadi pangkalan data hamba MysqlServer untuk melanggan fail Binlog pangkalan data utama MysqlServer

Apabila Canal bermula, ia akan mengkonfigurasi mesej MQ yang sepadan (RabbitMQ, RocketMQ, Kafka). Apabila ia mengesan perubahan dalam fail Binlog, ia akan menukar penyataan sql yang diubah ke dalam format json dan menghantarnya sebagai kandungan mesej Dalam projek MQ

, selagi anda memantau MQ yang sepadan, anda boleh mendapatkan. kandungan Binlog berubah Data Json mempunyai jenis operasi yang jelas (CURD) dan data yang sepadan. Segerakkan sahaja data yang sepadan dengan redis

Kelemahan 1: Keseluruhan proses operasi terusan yang melanggan Binlog adalah satu-benang, jadi dalam menghadapi konkurensi ultra-tinggi, prestasi mungkin tidak cemerlang. Anda boleh menggunakan berbilang Terusan dan berbilang pengguna, tetapi anda perlu memberi perhatian untuk mengelakkan masalah penggunaan berulang dan melakukan pengesahan mati pucuk

Kelebihan 1: Walaupun pangkalan data diubah suai secara manual, ia akan dipantau dan disegerakkan >

Kelebihan 2: Penyegerakan tak segerak, tiada kelewatan tambahan dalam pemulangan antara muka

4 Pemadaman berganda tertunda

Sebelum melaksanakan pengubahsuaian SQL, padamkan data redis dahulu

Laksanakan kemas kini sql

Lengah untuk satu tempoh masa

Padam semula data redis

// 延迟双删伪代码
deleteRedisCache(key);   // 删除redis缓存
updateMysqlSql(obj);        // 更新mysql
Thread.sleep(100);           // 延迟一段时间
deleteRedisCache(key);   // 再次删除该key的缓存

Keburukan: Masa kelewatan ini sukar dikawal, berapa lama kelewatan, ini sangat Sukar untuk dinilai

Jika anda tidak menggunakan pemadaman berganda tertunda, anda hanya memadam cache dan kemudian mengubah suai data MySQL. Apakah masalah yang akan timbul jika hanya terdapat dua langkah ini?

5. Permintaan tunggal, utas tunggal tiada masalah, tetapi masalah akan berlaku di bawah konkurensi tinggi dan berbilang benang

6 Jika utas Thread1 ingin mengemas kini data, utas Thread1 akan membersihkan semula pada masa ini

7 Pada masa ini, thread2 telah tiba, tetapi Thread2 belum selesai mengemas kini mysql

8 mysql, dan kemudian semak data yang ditemui Tulis ke cache

9 Memandangkan Thread1 tidak mempunyai masa untuk mengubah suai data mysql, data yang ditemui oleh Thread2 pada masa ini ialah [data lama], dan Thread2 menulis. data lama kepada Redis sekali lagi

10 Pada masa ini, utas Thread3 datang dan menanyakan Redis dan mendapati bahawa terdapat data, jadi ia terus mendapat data yang dicache Pada masa ini [Thread3 mengetahui data lama] dan kembali secara langsung dengan data lama. Inilah masalahnya

11 Fungsi pemadaman berganda tertunda adalah untuk menghalang Thread2 daripada menulis data lama lagi Dengan pemadaman berganda tertunda, Thread3 masih akan menjadi batal Redis, dan akan mendapat data terkini daripada mysql

12 Jadi masa tunda biasa hendaklah sepanjang masa dari Thread2 menyemak cache untuk mendapatkan data mysql dan kemudian menyimpannya ke redis, sebagai masa tunda Thread1, tetapi masa proses Thread2 akan dipengaruhi oleh banyak faktor Oleh itu, adalah sukar untuk menentukan berapa lama masa yang diperlukan

5 Penulisan berganda tertunda

// 延迟双写伪代码
updateMysqlSql(obj);        // 更新mysql
addRedis(key);   // 再次删除该key的缓存

Kecacatan kod di atas;

  • Di bawah konkurensi tinggi, dua utas dilaksanakan pada masa yang sama Kod di atas diubah suai kepada mysql, dan kandungan pengubahsuaian disekat, yang mungkin membawa kepada ketidakkonsistenan antara data Redis dan Mysql

  • Benang T1 selesai melaksanakan updateMysqlSql dan melepaskan kunci baris Pada masa ini, utas T2 melaksanakan sekali lagi updateMysqlSql dan addRedis, dan akhirnya T1 melaksanakan addRedis Benang T2, tetapi Redis ialah data benang T1

Pengoptimuman

// 完美延迟双写伪代码
开启事务
updateMysqlSql(obj);        // 更新mysql
addRedis(key);   // 再次删除该key的缓存
提交事务

Pembetulan kod di atas:

Letakkan dua baris kod ke dalam transaksi Hanya apabila T1 selesai melaksanakan Mysql dan Redis, T2 boleh memulakan pelaksanaan, dengan itu memastikan konsistensi data. Adalah disyorkan untuk menggunakan kunci teragih

Tulisan dua kali Kelemahan: Mysql dan Redis adalah satu-benang. Prestasi tidak bagus, jadi tidak digalakkan menggunakan

Atas ialah kandungan terperinci Bagaimana untuk menyegerakkan data MySQL ke cache Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam