Untuk mengurangkan ketidakkonsistenan data, mekanisme mengemas kini cache dan pangkalan data adalah amat penting. Seterusnya, saya akan membawa anda melalui perangkap.
Ketepikan cache
Iaitu, Pintas cache
, ialah strategi caching yang biasa digunakan. Cache aside
也就是旁路缓存
,是比较常用的缓存策略。
(1)读请求
(1)Baca permintaan
Proses biasa
The terlebih dahulu akan menentukan sama ada cache mempunyai data. daripada pangkalan data dan kemudian menulisnya kembali ke cache, dan akhirnya mengembalikan data kepada klien.
(2)Tulis permintaan
Lazim Proses写请求
常见流程
首先更新数据库,然后从缓存中删除该数据。
看了写请求的图之后,有些同学可能要问了:为什么要删除缓存,直接更新不就行了?这里涉及到几个坑,我们一步一步踩下去。
Cache aside策略如果用错就会遇到深坑,下面我们来逐个踩。
踩坑一:先更新数据库,再更新缓存
如果同时有两个写请求
需要更新数据,每个写请求都先更新数据库再更新缓存,在并发场景可能会出现数据不一致的情况。
如上图的执行过程:
(1)写请求1
更新数据库,将 age 字段更新为18;
(2)写请求2
Tulis permintaan
perlu mengemas kini data. Setiap permintaan tulis mengemas kini pangkalan data dahulu dan kemudian mengemas kini cache. Ketidakkonsistenan data mungkin berlaku dalam senario serentak. 🎜🎜🎜Kemas kini pangkalan data dahulu, kemudian kemas kini cache🎜🎜 ditunjukkan di atas Proses: 🎜🎜(1)Tulis permintaan 1Kemas kini pangkalan data dan kemas kini medan umur kepada 18 🎜🎜(2)<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left : 2px; background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>Tulis permintaan 2
Kemas kini pangkalan data dan kemas kini medan umur kepada 20;🎜(3)Tulis permintaan 2
Kemas kini cache , umur cache ditetapkan kepada 20; 写请求2
更新缓存,缓存 age 设置为20;
(4)写请求1
更新缓存,缓存 age 设置为18;
执行完预期结果是数据库 age 为20,缓存 age 为20,结果缓存 age为18,这就造成了缓存数据不是最新的,出现了脏数据。
踩坑二:先删缓存,再更新数据库
如果写请求
的处理流程是先删缓存再更新数据库
,在一个读请求
和一个写请求
并发场景下可能会出现数据不一致情况。
如上图的执行过程:
(1)写请求
删除缓存数据;
(2)读请求
查询缓存未击中(Hit Miss),紧接着查询数据库,将返回的数据回写到缓存中;
(3)写请求
Tulis Permintaan 1
mengemas kini cache, dan umur cache ditetapkan kepada 18 🎜🎜Selepas pelaksanaan, hasil yang dijangkakan ialah umur pangkalan data ialah 20, umur cache ialah 20 dan umur cache keputusan ialah 18; . Ini menyebabkan data cache bukan yang terkini dan muncul. 🎜🎜Pitfall 2: Padam cache dahulu, kemudian kemas kini pangkalan data🎜🎜JikaAliran pemprosesan permintaan tulis
ialah Padam cache dahulu dan kemudian kemas kini pangkalan data
, dalam Permintaan baca
dan Tulis permintaan
Ketidakkonsistenan data mungkin berlaku dalam senario serentak. 🎜🎜Proses pelaksanaan seperti yang ditunjukkan di atas:🎜🎜(1)Tulis permintaan
Padam data cache; 🎜🎜(2)Baca permintaan
Soal cache miss (Hit Miss), kemudian tanya pangkalan data , tulis kembali data yang dikembalikan ke cache 🎜🎜(3)Tulis permintaan
untuk mengemas kini pangkalan data. 🎜Selepas keseluruhan proses, saya mendapati bahawa umur dalam pangkalan data ialah 20, <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05) ;font-family: " operator mono consolas monaco menlo monospace break-all rgb>Cache
Umur ialah 18, cache Ia tidak konsisten dengan data pangkalan data dan data kotor muncul dalam cache. 数据库
中age为20,缓存
中age为18,缓存和数据库数据不一致,缓存出现了脏数据。
踩坑三:先更新数据库,再删除缓存
在实际的系统中针对写请求
还是推荐先更新数据库再删除缓存
,但是在理论上还是存在问题,以下面这个例子说明。
如上图的执行过程:
(1)读请求
先查询缓存,缓存未击中,查询数据库返回数据;
(2)写请求
更新数据库,删除缓存;
(3)读请求
回写缓存;
整个流程操作下来发现数据库age为20
,缓存age为18
Tulis permintaan
atau disyorkanKemas kini pangkalan data dahulu dan kemudian padamkan cache
, tetapi masih terdapat masalah dalam teori, seperti yang ditunjukkan dalam contoh berikut. 🎜🎜Proses pelaksanaan seperti yang ditunjukkan di atas:🎜🎜(1)Baca permintaan
mula-mula menanyakan cache, jika cache tidak dipukul, tanya pangkalan data untuk mengembalikan data; 🎜🎜 (2)Tulis permintaanKemas kini pangkalan data, padamkan Cache; 🎜🎜(3)<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background- warna: rgba(27, 31 , 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>Baca permintaan
Tulis balik cache 🎜🎜Selepas keseluruhan proses, didapati bahawa Umur pangkalan data ialah 20
, Umur cache ialah 18 code>, iaitu pangkalan data dan cache tidak konsisten, menyebabkan data yang dibaca oleh aplikasi daripada cache menjadi data lama. 🎜🎜Tetapi jika kita fikirkan dengan teliti, kebarangkalian masalah di atas berlaku sebenarnya sangat rendah, kerana operasi kemas kini pangkalan data biasanya mengambil masa beberapa urutan magnitud daripada operasi memori Langkah terakhir dalam gambar di atas adalah menulis semula cache (tetapkan umur 18) dengan cepat Ini biasanya dilakukan sebelum mengemas kini pangkalan data. 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;text-align: justify;font-size: 15px;">Apa yang perlu dilakukan sekiranya senario melampau ini berlaku? Kita perlu memikirkan penyelesaian: <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>Tetapan data cache masa tamat tempoh
. Biasanya dalam sistem, sejumlah kecil data boleh dibiarkan menjadi tidak konsisten untuk jangka masa yang singkat. 缓存数据设置过期时间
。通常在系统中是可以允许少量的数据短时间不一致的场景出现。
在 Cache Aside 更新模式中,应用代码需要维护两个数据源头:一个是缓存,一个是数据库。而在 Read-Through
策略下,应用程序无需管理缓存和数据库,只需要将数据库的同步委托给缓存提供程序 Cache Provider
即可。所有数据交互都是通过抽象缓存层
完成的。
如上图,应用程序只需要与Cache Provider
交互,不用关心是从缓存取还是数据库。
在进行大量读取时,Read-Through
可以减少数据源上的负载,也对缓存服务的故障具备一定的弹性。如果缓存服务挂了,则缓存提供程序仍然可以通过直接转到数据源来进行操作。
Read-Through 适用于多次请求相同数据的场景
Read-Through
strategi, digunakan program tidak perlu mengurus cache dan pangkalan data, ia hanya perlu mempercayakan penyegerakan pangkalan data kepada penyedia cachePembekal Cache
. Semua interaksi data adalah melalui Lapisan cache abstrak
Selesai . 🎜🎜Seperti yang ditunjukkan di atas, aplikasi hanya perlu dipadankan dengan Pembekal Cache
interaksi, tidak kira sama ada ia diambil daripada cache atau pangkalan data. 🎜🎜Apabila melakukan bacaan berat, Read-Through boleh mengurangkan beban pada sumber data dan juga berdaya tahan terhadap kegagalan perkhidmatan cache. Jika perkhidmatan cache hilang, pembekal cache masih boleh beroperasi dengan pergi terus ke sumber data. 🎜🎜<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05) ;font-family: " operator mono consolas monaco menlo monospace break-all rgb>Read-Through sesuai untuk berbilang permintaan untuk perkara yang sama data Senario
, ini hampir sama dengan strategi Cache-Aside, tetapi masih terdapat beberapa perbezaan antara kedua-duanya, yang ditekankan sekali lagi: 🎜Write-Through
Di bawah strategi, apabila kemas kini data (Tulis) berlaku, penyedia cache Pembekal Cache
bertanggungjawab mengemas kini sumber data dan cache yang mendasari. Write-Through
策略下,当发生数据更新(Write)时,缓存提供程序 Cache Provider
负责更新底层数据源和缓存。
缓存与数据源保持一致,并且写入时始终通过抽象缓存层
到达数据源。
Cache Provider
类似一个代理的作用。
Write behind
在一些地方也被成为Write back
, 简单理解就是:应用程序更新数据时只更新缓存, Cache Provider
每隔一段时间将数据刷新到数据库中。说白了就是延迟写入
Pembekal Cache
berfungsi seperti proksi . 🎜🎜🎜🎜Tulis di belakang🎜🎜Tulis di belakang
juga dipanggil Tulis balik
, pemahaman mudah ialah: apabila aplikasi mengemas kini data, ia hanya mengemas kini cache, Cache Provider
menyegarkan data ke dalam pangkalan data pada selang masa yang tetap. Secara terang-terangan, ia adalahPenulisan tertunda
. 🎜Seperti yang ditunjukkan dalam gambar di atas, apabila aplikasi mengemas kini dua data, Penyedia Cache akan menulisnya ke cache serta-merta, tetapi ia akan ditulis ke pangkalan data secara berkelompok selepas satu tempoh masa.
Kaedah ini mempunyai kelebihan dan kekurangan:
Kelebihan
ialah kelajuan menulis data sangat pantas dan sesuai untuk senario penulisan yang kerap. 优点
是数据写入速度非常快,适用于频繁写的场景。
缺点
Kelemahan
ialah caching Ia tidak sangat konsisten dengan pangkalan data dan harus digunakan dengan berhati-hati dalam sistem dengan keperluan konsistensi yang tinggi.
padamkan pangkalan data dahulu, kemudian hapuskan cache anda biasanya juga menetapkan masa cache untuk data.
Baca/Tulis melalui biasanya disediakan oleh Pembekal Cache untuk menyediakan operasi baca dan tulis luaran, dan aplikasi tidak perlu mengetahui sama ada cache atau pangkalan data sedang dikendalikan.
🎜Tulis di belakang hanya memahami bahawa ia tertunda menulis Pembekal Cache akan memasukkan pangkalan data dalam kelompok sekali-sekala Kelebihannya ialah aplikasi menulis dengan sangat cepat. 🎜🎜Baiklah, itu sahaja untuk hari ini. 🎜Atas ialah kandungan terperinci Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!