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

WBOY
Lepaskan: 2023-05-27 15:11:24
ke hadapan
737 orang telah melayarinya

    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!

    Label berkaitan:
    sumber:yisu.com
    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
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan