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.
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.
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.
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; } }
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.
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;
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;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); }
Urutan 2 memulakan permintaan sebelum utas 1 memadamkan cache Redis dan mendapatkan cache Redis yang tidak dipadamkan
Masalah itu masih wujud, dan ia berterusan dan berterusan tanpa henti.
Perkenalkan perisian tengah mesej untuk menyelesaikan pertempuran, dan semak semula secara terperinci.
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. 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!