Jadual Kandungan
Teks
Pemadaman berganda tertunda cache
Padam mekanisme percubaan semula cache
Baca biglog dan padam cache secara tak segerak
Rumah pangkalan data tutorial mysql Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian

Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian

Mar 15, 2022 am 11:18 AM
mysql redis

Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Artikel ini akan berkongsi dengan anda bagaimana untuk menyelesaikan masalah cache double-write inconsistency Saya harap ia dapat membantu anda!

Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian

redis dan mysql double-write cache tidak konsisten:

Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian

Tetapi dari segi mengemas kini cache, untuk 更新完数据库,是更新缓存呢,还是删除缓存。 atau Pertama 删除缓存,再更新数据库,其实大家存在很大的争议。 Pada masa ini tiada blog komprehensif yang menganalisis beberapa penyelesaian ini. Jadi blogger menulis artikel ini dengan tergetar dan berisiko dikritik oleh semua orang.

Teks

Tetapkan masa tamat tempoh untuk data cache

Biar saya membuat penjelasan dahulu cache Masa tamat adalah penyelesaian untuk memastikan konsistensi akhirnya. Di bawah penyelesaian ini, kami boleh menetapkan masa tamat tempoh untuk data yang disimpan dalam cache Semua operasi tulis tertakluk kepada pangkalan data dan kami hanya perlu melakukan yang terbaik untuk operasi cache. Maksudnya, jika penulisan pangkalan data berjaya dan kemas kini cache gagal, maka selagi masa tamat tempoh dicapai, permintaan baca seterusnya secara semula jadi akan membaca nilai baru dari pangkalan data dan mengisi semula cache. Oleh itu, idea yang dibincangkan seterusnya tidak bergantung pada penyelesaian menetapkan masa tamat untuk cache.

Di sini, mula-mula kita membincangkan tiga strategi kemas kini:

  1. Kemas kini pangkalan data dahulu, kemudian kemas kini cache
  2. Padam cache dahulu, kemudian Kemas kini pangkalan data
  3. Kemas kini pangkalan data dahulu, kemudian padamkan cache

Kemas kini pangkalan data dahulu, kemudian kemas kini cache

Ini penyelesaian umumnya ditentang oleh semua orang. kenapa? Terdapat dua perkara berikut:

  • Sebab satu (perspektif keselamatan benang)

(1) Thread A mengemas kini pangkalan data
(2) Thread B mengemas kini pangkalan data
(3) Thread B mengemas kini cache
(4) Thread A mengemas kini cache

Ini bermakna meminta A untuk mengemas kini cache harus lebih awal daripada meminta B untuk mengemas kini cache Walau bagaimanapun , atas sebab rangkaian dan lain-lain, Tetapi B mengemas kini cache lebih awal daripada A. Ini mengakibatkan data kotor dan oleh itu tidak dipertimbangkan.

  • Sebab Kedua (Perspektif Senario Perniagaan)

(1) Jika anda mempunyai keperluan perniagaan dengan lebih banyak senario penulisan pangkalan data dan kurang senario membaca data, gunakan ini Penyelesaian ini akan menyebabkan cache yang akan dikemas kini dengan kerap sebelum data dibaca, yang membazirkan prestasi.

(2) Jika nilai yang anda tulis ke pangkalan data tidak ditulis terus ke dalam cache, ia mesti melalui satu siri pengiraan yang kompleks dan kemudian ditulis ke dalam cache. Kemudian, mengira nilai yang ditulis ke cache sekali lagi setiap kali ia ditulis ke pangkalan data sudah pasti satu pembaziran prestasi. Jelas sekali, memadam cache adalah lebih sesuai.

Padam cache dahulu, dan kemudian kemas kini pangkalan data

Sebab penyelesaian ini akan membawa kepada ketidakkonsistenan ialah. Pada masa yang sama, seorang meminta A untuk melakukan operasi kemas kini, dan yang lain meminta B untuk melaksanakan operasi pertanyaan. Kemudian situasi berikut akan berlaku:

(1) Minta A melakukan operasi tulis dan padam cache
(2) Minta B untuk bertanya dan mendapati cache tidak wujud
(3 ) Minta B untuk menanyakan pangkalan data untuk mendapatkan nilai lama
(4) Minta B untuk menulis nilai lama ke cache
(5) Minta A untuk menulis nilai baru ke pangkalan data

Keadaan di atas akan membawa kepada ketidakkonsistenan. Selain itu, jika anda tidak menetapkan strategi masa tamat tempoh untuk cache, data akan sentiasa menjadi data kotor.

Jadi, bagaimana untuk menyelesaikannya? Gunakan strategi pemadaman berganda tertunda

Pemadaman berganda tertunda cache

public class CacheServiceImpl implements ICacheService {

    @Resource
    private RedisOperator redisOperator;
    
    @Autowired
    private IShopService shopService;

    //1. 采用延时双删,解决数据库和缓存的一致性
    @Override
    public void updateHotCount(String id) {
        try {
            //删除缓存
            redisOperator.del("redis_key_" + id);
            //更新数据库
            shopService.updataHotShop();
            Thread.sleep(1000);//休眠1秒
            //延时删除
            redisOperator.del("redis_key_" + id);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }

    @Override
    public Integer getHotCount(String id) {
        return null;
    }}
Salin selepas log masuk

Penjelasan:

  1. Hapuskan cache dahulu
  2. Tulis ke pangkalan data sekali lagi
  3. Tidur selama 1 saat, dan kemudian padamkan cache (Dengan melakukan ini, data kotor yang dicache yang disebabkan dalam masa 1 saat boleh dipadamkan semula.)

Memandangkan situasi di atas, pembaca harus menilai logik perniagaan membaca data yang memakan masa bagi projek mereka sendiri. Kemudian masa tidur untuk menulis data adalah berdasarkan penggunaan masa logik perniagaan untuk membaca data, ditambah dengan beberapa ratus milisaat. Tujuannya adalah untuk memastikan permintaan baca tamat, dan permintaan tulis boleh memadamkan data kotor yang dicache yang disebabkan oleh permintaan baca.

Bagaimana jika pangkalan data menggunakan seni bina pemisahan baca-tulis? (Pustaka utama bertanggungjawab untuk operasi menulis, dan perpustakaan hamba bertanggungjawab untuk operasi membaca)

ok, dalam kes ini, sebab ketidakkonsistenan data adalah seperti berikut, masih terdapat dua permintaan dan satu permintaan A melakukan operasi kemas kini, dan satu lagi permintaan B untuk melaksanakan operasi pertanyaan.

(1) Minta A untuk melakukan operasi tulis, padam cache dan minta A untuk menulis data ke pustaka utama Penyegerakan daripada pustaka hamba belum bermula

(2) (dalam 1s) Minta B untuk menanyakan cache , cache tidak dijumpai, dan B diminta untuk menanyakan pangkalan data hamba Pada masa ini, penyegerakan induk-hamba belum selesai, dan nilai lama ditemui, dan nilai lama ditulis pada cache.

(3) Pangkalan data induk melengkapkan penyegerakan induk-hamba, dan pangkalan data hamba bertukar kepada nilai baharu

Proses di atas ialah masalah ketidakkonsistenan data, dan kelewatan pemadaman dua kali strategi juga digunakan. Walau bagaimanapun, masa tidur diubah suai berdasarkan masa tunda penyegerakan tuan-hamba, ditambah beberapa ratus ms

Jika strategi penyingkiran penyegerakan ini diguna pakai, apakah yang perlu saya lakukan jika daya pemprosesan dikurangkan ?

ok, kemudian jadikan pemadaman kedua tidak segerak. Mulakan benang sendiri dan padamkannya secara tidak segerak. Dengan cara ini, permintaan bertulis tidak perlu tidur untuk tempoh masa sebelum kembali. Melakukannya meningkatkan daya tampung.

Pemadaman kedua, apakah yang perlu saya lakukan jika pemadaman gagal?

Ini adalah soalan yang sangat bagus, kerana jika pemadaman gagal untuk kali kedua, situasi berikut akan berlaku. Masih terdapat dua permintaan, satu permintaan A untuk melaksanakan operasi kemas kini, dan satu lagi permintaan B untuk melaksanakan operasi pertanyaan Untuk kemudahan, ia diandaikan sebagai satu pangkalan data:

(1) Permintaan A kepada. lakukan operasi tulis dan padam cache
( 2) Minta B untuk membuat pertanyaan dan mendapati bahawa cache tidak wujud
(3) Minta B untuk menanyakan pangkalan data untuk mendapatkan nilai lama
(4) Minta B untuk menulis nilai lama ke dalam cache
(5) Minta A untuk menulis Pangkalan Data nilai baharu
(6) Permintaan A cuba memadamkan nilai cache yang ditulis oleh permintaan B, tetapi gagal.

ok, maksudnya. Jika pemadaman cache gagal untuk kali kedua, cache dan ketidakkonsistenan pangkalan data akan berlaku lagi.

Bagaimana untuk menyelesaikannya?

Untuk penyelesaian khusus, mari lihat analisis blogger mengenai strategi kemas kini mengemas kini pangkalan data dahulu dan kemudian memadam cache.

Padam mekanisme percubaan semula cache

Sama ada Pemadaman dua kali tertunda atau Cache-Aside mengendalikan pangkalan data dahulu dan kemudian memadam cache , mungkin terdapat masalah ketidakkonsistenan data yang disebabkan oleh kegagalan memadam cache dalam langkah kedua. Anda boleh menggunakan penyelesaian ini untuk mengoptimumkan: jika pemadaman gagal, hanya padamkannya beberapa kali lagi untuk memastikan pemadaman cache berjaya~ Jadi anda boleh memperkenalkan mekanisme cuba semula cache padam

Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian

  1. (1) Kemas kini data pangkalan data
    (2) Pemadaman cache gagal kerana pelbagai masalah
    (3) Hantar kunci yang perlu dipadamkan ke baris gilir mesej
    (4) Habis mesej sendiri, Dapatkan kunci yang perlu dipadam
    (5) Teruskan mencuba semula operasi pemadaman sehingga berjaya

Walau bagaimanapun, penyelesaian ini mempunyai kekurangan , menyebabkan banyak pencerobohan ke dalam kod baris perniagaan. Jadi kita mempunyai pilihan kedua Dalam pilihan kedua, mulakan program langganan untuk melanggan binlog pangkalan data untuk mendapatkan data yang perlu dikendalikan. Dalam aplikasi, mulakan program baharu untuk mendapatkan maklumat daripada program langganan ini dan padamkan cache.

Baca biglog dan padam cache secara tak segerak

Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian

Prosesnya adalah seperti yang ditunjukkan dalam rajah di bawah:

( 1) Kemas kini Data pangkalan data
(2) Pangkalan data akan menulis maklumat operasi ke dalam log binlog
(3) Program langganan mengekstrak data dan kunci yang diperlukan
(4) Mulakan bahagian baharu bukan- kod perniagaan untuk mendapatkan maklumat
(5) Cuba padamkan operasi cache dan dapati pemadaman gagal
(6) Hantar maklumat ke baris gilir mesej
(7) Dapatkan semula data daripada baris gilir mesej dan cuba semula operasi.

Catatan: Program langganan binlog di atas mempunyai perisian tengah siap sedia dipanggil canal dalam mysql, yang boleh melengkapkan fungsi melanggan log binlog. Bagi Oracle pula, blogger buat masa ini tidak tahu sama ada terdapat middleware siap pakai yang boleh digunakan. Selain itu, bagi mekanisme cuba semula, penulis blog menggunakan baris gilir mesej. Jika keperluan konsistensi tidak begitu tinggi, mulakan sahaja urutan baru dalam program dan cuba sekali-sekala Anda boleh menggunakan ini secara fleksibel, tetapi saya hanya memberikan idea.

Artikel ini sebenarnya adalah ringkasan penyelesaian ketekalan sedia ada di Internet. Mengenai strategi kemas kini untuk memadam cache terlebih dahulu dan kemudian mengemas kini pangkalan data, terdapat juga rancangan untuk mengekalkan baris gilir memori Blogger melihatnya dan merasakan bahawa pelaksanaannya sangat rumit dan tidak perlu, jadi tidak perlu memberikannya. dalam artikel. Akhir sekali, saya harap anda semua mendapat sesuatu.

[Cadangan berkaitan: tutorial video mysql]

Atas ialah kandungan terperinci Apakah yang perlu saya lakukan jika cache tulis dua kali Redis dan MySQL tidak konsisten? Perkongsian penyelesaian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara Membina Mod Kluster Redis Cara Membina Mod Kluster Redis Apr 10, 2025 pm 10:15 PM

Mod Redis cluster menyebarkan contoh Redis ke pelbagai pelayan melalui sharding, meningkatkan skalabilitas dan ketersediaan. Langkah -langkah pembinaan adalah seperti berikut: Buat contoh Redis ganjil dengan pelabuhan yang berbeza; Buat 3 contoh sentinel, memantau contoh redis dan failover; Konfigurasi fail konfigurasi sentinel, tambahkan pemantauan maklumat contoh dan tetapan failover; Konfigurasi fail konfigurasi contoh Redis, aktifkan mod kluster dan tentukan laluan fail maklumat kluster; Buat fail nodes.conf, yang mengandungi maklumat setiap contoh Redis; Mulakan kluster, laksanakan perintah Buat untuk membuat kluster dan tentukan bilangan replika; Log masuk ke kluster untuk melaksanakan perintah maklumat kluster untuk mengesahkan status kluster; buat

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

Cara membaca kod sumber redis Cara membaca kod sumber redis Apr 10, 2025 pm 08:27 PM

Cara terbaik untuk memahami kod sumber REDIS adalah dengan langkah demi langkah: Dapatkan akrab dengan asas -asas Redis. Pilih modul atau fungsi tertentu sebagai titik permulaan. Mulakan dengan titik masuk modul atau fungsi dan lihat baris kod mengikut baris. Lihat kod melalui rantaian panggilan fungsi. Berhati -hati dengan struktur data asas yang digunakan oleh REDIS. Kenal pasti algoritma yang digunakan oleh Redis.

Cara menggunakan perintah redis Cara menggunakan perintah redis Apr 10, 2025 pm 08:45 PM

Menggunakan Arahan Redis memerlukan langkah -langkah berikut: Buka klien Redis. Masukkan arahan (nilai kunci kata kerja). Menyediakan parameter yang diperlukan (berbeza dari arahan ke arahan). Tekan Enter untuk melaksanakan arahan. Redis mengembalikan tindak balas yang menunjukkan hasil operasi (biasanya OK atau -r).

Ringkasan kelemahan phpmyadmin Ringkasan kelemahan phpmyadmin Apr 10, 2025 pm 10:24 PM

Kunci strategi pertahanan keselamatan phpmyadmin adalah: 1. Gunakan versi terkini Phpmyadmin dan kerap mengemas kini PHP dan MySQL; 2. Mengawal hak akses, penggunaan. Htaccess atau kawalan akses pelayan web; 3. Dayakan kata laluan yang kuat dan pengesahan dua faktor; 4. Menyokong pangkalan data secara teratur; 5. Berhati -hati semak fail konfigurasi untuk mengelakkan mendedahkan maklumat sensitif; 6. Gunakan Firewall Aplikasi Web (WAF); 7. Menjalankan audit keselamatan. Langkah-langkah ini secara berkesan dapat mengurangkan risiko keselamatan yang disebabkan oleh phpmyadmin disebabkan oleh konfigurasi yang tidak betul, versi yang lebih lama atau risiko keselamatan alam sekitar, dan memastikan keselamatan pangkalan data.

PHPMyAdmin Connection MySQL PHPMyAdmin Connection MySQL Apr 10, 2025 pm 10:57 PM

Bagaimana untuk menyambung ke MySQL menggunakan phpmyadmin? URL untuk mengakses phpmyadmin biasanya http: // localhost/phpmyadmin atau http: // [alamat ip pelayan anda]/phpmyadmin. Masukkan nama pengguna dan kata laluan MySQL anda. Pilih pangkalan data yang ingin anda sambungkan. Klik butang "Sambungan" untuk membuat sambungan.

Cara Mengosongkan Data dengan Redis Cara Mengosongkan Data dengan Redis Apr 10, 2025 pm 08:03 PM

Dua kaedah berikut boleh digunakan untuk membersihkan data dalam REDIS: Perintah Flushall: Padam semua kunci dan nilai dalam pangkalan data. Config ResetStat Command: Tetapkan semula semua negeri pangkalan data (termasuk kunci, nilai, dan statistik lain).

Cara Menetapkan Dasar Tamat Redis Cara Menetapkan Dasar Tamat Redis Apr 10, 2025 pm 10:03 PM

Terdapat dua jenis strategi tamat tempoh data REDIS: Penghapusan berkala: Imbasan berkala untuk memadamkan kunci yang telah tamat tempoh, yang boleh ditetapkan melalui parameter-cap-cap-rempah yang telah tamat tempoh dan parameter kelewatan-cap-remove-time-time. Penghapusan Lazy: Periksa kekunci yang telah tamat tempoh hanya apabila kunci dibaca atau ditulis. Mereka boleh ditetapkan melalui parameter lazon-lazy-expire-expire-expire, lazy-lazy-user-del parameter.

See all articles