Jadual Kandungan
1. Kemas kini strategi
2. Baca dan tulis cache
1 Strategi tulis langsung segerak
2. Strategi tulis perlahan tak segerak
3. Periksa semula strategi penguncian
4. Kemas kini strategi untuk pangkalan data dan konsistensi cache
1 Kemas kini pangkalan data dahulu, kemudian kemas kini Redis
2. Kemas kini cache dahulu, kemudian kemas kini pangkalan data
Walau bagaimanapun, pangkalan data MySQL belum dikemas kini, thread 2 membaca nilai lama dalam MySQL, dan kemudian thread 2 juga menulis nilai lama ke Redis sebagai cache data; > Thread 1. Selepas mengemas kini data MySQL, saya mendapati bahawa sudah ada data dalam Redis, yang telah dipadam sebelum ini, jadi saya tidak akan mengemas kininya; .
Saya rasa anda lambat walaupun anda tidak tidur, tetapi anda masih tertidur... 1 kemas kini pangkalan data dahulu, kemudian padamkan cache Redis
Urutan 1 baru sahaja memadamkan data cache Redis pada masa ini;
Rumah pangkalan data tutorial mysql Apakah strategi kemas kini untuk pangkalan data MySQL dan konsistensi cache Redis?

Apakah strategi kemas kini untuk pangkalan data MySQL dan konsistensi cache Redis?

May 27, 2023 pm 03:11 PM
mysql redis

    1. Kemas kini strategi

    1. Jika terdapat data dalam Redis, ia perlu sama dengan nilai dalam pangkalan data.

    2. Jika tiada data dalam Redis, Redis mesti dikemas kini secara serentak dengan nilai terkini dalam pangkalan data.

    2. Baca dan tulis cache

    1 Strategi tulis langsung segerak

    Menulis ke pangkalan data juga menulis ke cache Redis secara serentak dengan data dalam pangkalan data; untuk cache baca dan tulis Dalam erti kata lain, untuk memastikan bahawa data dalam cache dan pangkalan data adalah konsisten, adalah perlu untuk memastikan strategi tulis langsung segerak.

    2. Strategi tulis perlahan tak segerak

    Dalam sesetengah operasi perniagaan, selepas data MySQL dikemas kini, data Redis dibenarkan untuk disegerakkan selepas tempoh masa tertentu, seperti sistem logistik.

    Apabila pengecualian berlaku, tindakan yang gagal itu perlu ditampal semula, dan ia perlu ditulis semula dengan bantuan rabbitmq atau kafka.

    3. Periksa semula strategi penguncian

    Berbilang utas menanyakan data ini dalam pangkalan data pada masa yang sama, kemudian kita boleh menggunakan kunci mutex pada permintaan data pertanyaan pertama Hidupkannya.

    Urutan lain tidak boleh mendapatkan kunci pada ketika ini dan tunggu sehingga urutan pertama menanyakan data dan kemudian menyimpannya dalam cache.

    Kemudian benang masuk dan mendapati bahawa sudah ada cache, jadi mereka pergi terus ke cache.

    public String get(String key){
        // 从Redis缓存中读取
        String value = redisTemplate.get(key);
    
        if(value != null){
            return value;
        }
    
        synchronized (RedisTest.class){
            // 重新尝试从Redis缓存中读取
            value = redisTemplate.get(key);
            if(value != null){
                return value;
            }
    
            // 从MySQL数据库中查询
            value = studentDao.get(key);
            // 写入Redis缓存
            redisTemplate.setnx(key,value,time);
            return value;
        }
    }
    Salin selepas log masuk

    4. Kemas kini strategi untuk pangkalan data dan konsistensi cache

    1 Kemas kini pangkalan data dahulu, kemudian kemas kini Redis

    Mengikut akal, ini sepatutnya berlaku, bukan. ? Jadi, apakah masalah dalam kes ini?

    Apakah yang berlaku jika pengecualian berlaku sebelum mengemas kini Redis selepas berjaya mengemas kini pangkalan data?

    Pangkalan data tidak konsisten dengan data cache dalam Redis.

    2. Kemas kini cache dahulu, kemudian kemas kini pangkalan data

    Akan ada masalah dalam situasi berbilang benang.

    Contohnya

    • Kemas kini benang 1 redis = 200;

    • Kemas kini benang 2 redis = 100;

    • Kemas kini Thread 2 MySQL = 100;

    • Kemas kini Thread 1 MySQL = 200; = 100, MySQL=200;

    • 3. Padam cache dahulu, kemudian kemas kini pangkalan data

    Thread 1 memadam data cache Redis, dan kemudian mengemas kini pangkalan data MySQL

    Thread 2 datang untuk membunuh saya sebelum MySQL; dikemas kini. , baca data cache;

    Walau bagaimanapun, pangkalan data MySQL belum dikemas kini, thread 2 membaca nilai lama dalam MySQL, dan kemudian thread 2 juga menulis nilai lama ke Redis sebagai cache data; > Thread 1. Selepas mengemas kini data MySQL, saya mendapati bahawa sudah ada data dalam Redis, yang telah dipadam sebelum ini, jadi saya tidak akan mengemas kininya; .

    Pemadaman berganda tertunda

    Pemadaman berganda tertunda boleh menyelesaikan masalah di atas, selagi masa tidur lebih lama daripada masa untuk thread 2 membaca data dan kemudian menulisnya ke cache, iaitu benang 1 Operasi pembersihan cache kedua mesti dilakukan selepas utas 2 menulis ke cache, untuk memastikan data dalam cache Redis dikemas kini.

    /**
     * 延时双删
     * @autor 哪吒编程
     */
    public void deleteRedisData(Student stu){
        // 删除Redis中的缓存数据
        jedis.del(stu);
    
        // 更新MySQL数据库数据
        studentDao.update(stu);
    
        // 休息两秒
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        // 删除Redis中的缓存数据
        jedis.del(stu);
    }
    Salin selepas log masuk

    Masalah terbesar dengan pemadaman berganda yang tertunda adalah tidur Hari ini, apabila kecekapan adalah raja, lebih baik tidak menggunakan tidur.
    Saya rasa anda lambat walaupun anda tidak tidur, tetapi anda masih tertidur... 1 kemas kini pangkalan data dahulu, kemudian padamkan cache Redis

    Urutan 2 memulakan permintaan sebelum utas 1 memadamkan cache Redis dan mendapatkan cache Redis yang tidak dipadamkan

    Urutan 1 baru sahaja memadamkan data cache Redis pada masa ini;

    1. Masalah itu masih wujud, dan ia berterusan dan berterusan tanpa henti.

    2. Bagaimana untuk menyelesaikan situasi ini?
    3. Perkenalkan perisian tengah mesej untuk menyelesaikan pertempuran, dan semak semula secara terperinci.

    4. Kemas kini pangkalan data;

    Pangkalan data menulis maklumat operasi ke log binlog; >Langgan program Ekstrak kunci dan data; maklumat data kepada perisian tengah mesej; 🎜>Nezha mengesyorkan menggunakan Bab 1 Empat cara, mula-mula kemas kini pangkalan data dan kemudian padamkan cache.

    Kekurangan kaedah ① dan kaedah ② terlalu jelas untuk dipertimbangkan;

    Kaedah tidur ③ sentiasa sakit kepala;

    Kaedah ④ adalah penyelesaian yang lebih komprehensif, tetapi ia meningkatkan Kos pembelajaran dan kos penyelenggaraan kerana penambahan perisian tengah mesej.

      5. Prinsip kerja replikasi master-slave MySQL
    1. 1 Apabila data pada pelayan induk berubah, perubahannya ditulis ke dalam peristiwa binari fail log;

      2. Pelayan salve slave akan mengesan log binari pada pelayan induk dalam selang masa tertentu untuk mengesan sama ada ia telah berubah
    2. Jika pelayan induk dikesan log peristiwa binari pelayan berubah, Benang I/O dimulakan untuk meminta log peristiwa binari induk

      3 Pada masa yang sama, pelayan induk memulakan Benang buangan untuk setiap Benang I/O untuk dihantar data padanya. Hantar log peristiwa binari;
    3. 4

      5. Pelayan salve slave akan memulakan SQL Thread untuk membaca log binari dari log geganti dan memainkannya semula secara setempat untuk menjadikan datanya konsisten dengan pelayan utama

      6 dan SQL Thread akan tidur dan menunggu masa berikutnya ia dikejutkan.

    Atas ialah kandungan terperinci Apakah strategi kemas kini untuk pangkalan data MySQL dan konsistensi cache Redis?. 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)
    2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    Repo: Cara menghidupkan semula rakan sepasukan
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
    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)

    Bagaimana untuk mengoptimumkan prestasi pertanyaan MySQL dalam PHP? Bagaimana untuk mengoptimumkan prestasi pertanyaan MySQL dalam PHP? Jun 03, 2024 pm 08:11 PM

    Prestasi pertanyaan MySQL boleh dioptimumkan dengan membina indeks yang mengurangkan masa carian daripada kerumitan linear kepada kerumitan logaritma. Gunakan PreparedStatements untuk menghalang suntikan SQL dan meningkatkan prestasi pertanyaan. Hadkan hasil pertanyaan dan kurangkan jumlah data yang diproses oleh pelayan. Optimumkan pertanyaan penyertaan, termasuk menggunakan jenis gabungan yang sesuai, membuat indeks dan mempertimbangkan untuk menggunakan subkueri. Menganalisis pertanyaan untuk mengenal pasti kesesakan; gunakan caching untuk mengurangkan beban pangkalan data;

    Bagaimana untuk menggunakan sandaran dan pemulihan MySQL dalam PHP? Bagaimana untuk menggunakan sandaran dan pemulihan MySQL dalam PHP? Jun 03, 2024 pm 12:19 PM

    Membuat sandaran dan memulihkan pangkalan data MySQL dalam PHP boleh dicapai dengan mengikuti langkah berikut: Sandarkan pangkalan data: Gunakan arahan mysqldump untuk membuang pangkalan data ke dalam fail SQL. Pulihkan pangkalan data: Gunakan arahan mysql untuk memulihkan pangkalan data daripada fail SQL.

    Bagaimana untuk memasukkan data ke dalam jadual MySQL menggunakan PHP? Bagaimana untuk memasukkan data ke dalam jadual MySQL menggunakan PHP? Jun 02, 2024 pm 02:26 PM

    Bagaimana untuk memasukkan data ke dalam jadual MySQL? Sambung ke pangkalan data: Gunakan mysqli untuk mewujudkan sambungan ke pangkalan data. Sediakan pertanyaan SQL: Tulis pernyataan INSERT untuk menentukan lajur dan nilai yang akan dimasukkan. Laksanakan pertanyaan: Gunakan kaedah query() untuk melaksanakan pertanyaan sisipan Jika berjaya, mesej pengesahan akan dikeluarkan.

    Bagaimana untuk membetulkan ralat mysql_native_password tidak dimuatkan pada MySQL 8.4 Bagaimana untuk membetulkan ralat mysql_native_password tidak dimuatkan pada MySQL 8.4 Dec 09, 2024 am 11:42 AM

    Salah satu perubahan utama yang diperkenalkan dalam MySQL 8.4 (keluaran LTS terkini pada 2024) ialah pemalam "Kata Laluan Asli MySQL" tidak lagi didayakan secara lalai. Selanjutnya, MySQL 9.0 mengalih keluar pemalam ini sepenuhnya. Perubahan ini mempengaruhi PHP dan apl lain

    Bagaimana untuk menggunakan prosedur tersimpan MySQL dalam PHP? Bagaimana untuk menggunakan prosedur tersimpan MySQL dalam PHP? Jun 02, 2024 pm 02:13 PM

    Untuk menggunakan prosedur tersimpan MySQL dalam PHP: Gunakan PDO atau sambungan MySQLi untuk menyambung ke pangkalan data MySQL. Sediakan penyata untuk memanggil prosedur tersimpan. Laksanakan prosedur tersimpan. Proses set keputusan (jika prosedur tersimpan mengembalikan hasil). Tutup sambungan pangkalan data.

    Bagaimana untuk membuat jadual MySQL menggunakan PHP? Bagaimana untuk membuat jadual MySQL menggunakan PHP? Jun 04, 2024 pm 01:57 PM

    Mencipta jadual MySQL menggunakan PHP memerlukan langkah berikut: Sambung ke pangkalan data. Buat pangkalan data jika ia tidak wujud. Pilih pangkalan data. Buat jadual. Laksanakan pertanyaan. Tutup sambungan.

    Bagaimana untuk memadam data dari jadual MySQL menggunakan PHP? Bagaimana untuk memadam data dari jadual MySQL menggunakan PHP? Jun 05, 2024 pm 12:40 PM

    PHP menyediakan kaedah berikut untuk memadam data dalam jadual MySQL: DELETE statement: digunakan untuk memadamkan baris keadaan yang sepadan daripada jadual. Pernyataan TRUNCATETABLE: digunakan untuk mengosongkan semua data dalam jadual, termasuk ID yang dinaikkan secara automatik. Kes praktikal: Anda boleh memadamkan pengguna daripada pangkalan data menggunakan borang HTML dan kod PHP. Borang menyerahkan ID pengguna dan kod PHP menggunakan pernyataan DELETE untuk memadam rekod yang sepadan dengan ID daripada jadual pengguna.

    Bagaimana untuk menyediakan kolam sambungan MySQL menggunakan PHP? Bagaimana untuk menyediakan kolam sambungan MySQL menggunakan PHP? Jun 04, 2024 pm 03:28 PM

    Menyediakan kumpulan sambungan MySQL menggunakan PHP boleh meningkatkan prestasi dan kebolehskalaan. Langkah-langkahnya termasuk: 1. Pasang sambungan MySQLi 2. Buat kelas kumpulan sambungan 3. Tetapkan konfigurasi kumpulan sambungan 5. Dapatkan dan lepaskan sambungan; Dengan pengumpulan sambungan, aplikasi boleh meningkatkan prestasi dengan mengelak daripada membuat sambungan pangkalan data baharu untuk setiap permintaan.

    See all articles