Biasanya, kami akan memberi keutamaan untuk menggunakan cache Redis untuk mengurangkan beban akses pangkalan data. Walau bagaimanapun, kami juga akan menghadapi situasi berikut: apabila sebilangan besar pengguna mengakses sistem kami, mereka akan menanyakan cache terlebih dahulu Jika tiada data dalam cache, mereka akan menanyakan pangkalan data, dan kemudian mengemas kini data ke cache , dan jika data dalam pangkalan data telah berubah Ia perlu disegerakkan kepada redis Semasa proses penyegerakan, ketekalan data antara MySQL dan redis perlu dipastikan Ia adalah perkara biasa untuk kelewatan data yang singkat berlaku semasa proses penyegerakan ini. tetapi pada akhirnya adalah perlu untuk memastikan konsistensi antara mysql dan cache.
//我们通常使用redis的逻辑 //通常我们是先查询reids String value = RedisUtils.get(key); if (!StringUtils.isEmpty(value)){ return value; } //从数据库中获取数据 value = getValueForDb(key); if (!StringUtils.isEmpty(value)){ RedisUtils.set(key,value); return value; }
Strategi pemadaman berganda tertunda ialah strategi biasa untuk penyimpanan pangkalan data dan data cache untuk mengekalkan konsistensi dalam sistem teragih, tetapi ia tidak begitu konsisten. Malah, tidak kira penyelesaian yang digunakan, masalah data kotor dalam Redis tidak dapat dielakkan Ia hanya boleh mengurangkan masalah ini untuk menyelesaikannya sepenuhnya, kunci penyegerakan dan tahap logik perniagaan yang sepadan mesti digunakan untuk menyelesaikannya.
Secara amnya apabila kami mengemas kini data pangkalan data, kami perlu menyegerakkan data yang dicache dalam redis, jadi kami biasanya memberikan dua penyelesaian:
Penyelesaian pertama: laksanakan operasi kemas kini pertama , dan kemudian lakukan pembersihan cache.
Pilihan kedua: lakukan pembersihan cache dahulu, dan kemudian lakukan operasi kemas kini.
Walau bagaimanapun, kedua-dua penyelesaian ini terdedah kepada masalah berikut dalam permintaan serentak
Kelemahan penyelesaian pertama: apabila permintaan 1 pergi Selepas operasi kemas kini pangkalan data dilakukan, sebelum pembersihan cache dilakukan, permintaan 2 masuk untuk menanyakan cache Pada masa ini, data dalam cache masih merupakan data lama, dan ia belum dipadamkan sebelum ia boleh dipadamkan. , menyebabkan masalah data. Walau bagaimanapun, selepas t1 menjalankan operasi pemadaman cache, Permintaan seterusnya tidak boleh menanyakan cache, kemudian menanyakan data, dan kemudian mengemas kininya kepada cache Impak ini agak kecil
benang t1 mengemas kini db terlebih dahulu; utas telah mengemas kini db, dianggarkan kunci cache akan dipadamkan dalam masa 5 milisaat dan utas lain akan membuat pertanyaan dalam masa 5 milisaat Hasil cache masih merupakan data lama, tetapi hasil cache pertanyaan kosong selepas 5 milisaat dan. keputusan db terkini disegerakkan ke Redis sekali lagi.
Adalah perkara biasa berlaku kelewatan dalam sesuatu projek, jadi kesan kelewatan tersebut terhadap perniagaan sebenarnya sangat terhad. Tetapi bagaimana jika ia berlaku dan pemadaman cache gagal?
1 Teruskan mencuba----jika ia berada dalam antara muka protokol http, tindak balas antara muka akan menjadi perlahan dan tamat masa tindak balas akan berlaku apabila memanggil antara muka ini 2. Atau segerakan melalui borang tak segerak mq
RedisUtils.del(key);// 先删除缓存 updateDB(user);// 更新db中的数据 Thread.sleep(N);// 延迟一段时间,在删除该缓存key RedisUtils.del(key);// 先删除缓存
Atas ialah kandungan terperinci Cara menggunakan strategi padam berganda tertunda redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!