Rumah  >  Artikel  >  Java  >  Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?

Java学习指南
Java学习指南ke hadapan
2023-07-26 14:53:291756semak imbas

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?


Dalam sistem yang besar, mekanisme caching biasanya diperkenalkan untuk mengurangkan tekanan pangkalan data Setelah caching diperkenalkan, mudah untuk menyebabkan ketidakkonsistenan antara cache dan data pangkalan data, menyebabkan pengguna melihat data lama .

Untuk mengurangkan ketidakkonsistenan data, mekanisme mengemas kini cache dan pangkalan data adalah amat penting. Seterusnya, saya akan membawa anda melalui perangkap.

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?

Cache ketepikan

Ketepikan cache Iaitu, Pintas cache , ialah strategi caching yang biasa digunakan. Cache aside也就是旁路缓存,是比较常用的缓存策略。

(1)读请求(1)Baca permintaanProses biasa

🎜
Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Cache selain Ready Request

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 permintaanLazim Proses写请求常见流程

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Cache aside 写请求

首先更新数据库,然后从缓存中删除该数据。

看了写请求的图之后,有些同学可能要问了:为什么要删除缓存,直接更新不就行了?这里涉及到几个坑,我们一步一步踩下去。

Cache aside踩坑

Cache aside策略如果用错就会遇到深坑,下面我们来逐个踩。

踩坑一:先更新数据库,再更新缓存

如果同时有两个写请求需要更新数据,每个写请求都先更新数据库再更新缓存,在并发场景可能会出现数据不一致的情况。

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
先更新数据库,再更新缓存

如上图的执行过程:

(1)写请求1更新数据库,将 age 字段更新为18;

(2)写请求2

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?🎜Cache tepi dulu🎜permintaan tulis🎜 pangkalan data dan padam data daripada cache. 🎜🎜Selepas melihat gambar permintaan tulis, sesetengah pelajar mungkin bertanya: Mengapa kita perlu memadam cache tidak bolehkah kita mengemas kini terus? Terdapat beberapa perangkap yang terlibat di sini, mari kita melangkah melaluinya langkah demi langkah. 🎜

Cache aside trap

🎜Cache aside strategy akan ditemui jika digunakan secara salah. pit, mari kita melangkah ke dalamnya satu demi satu. 🎜🎜🎜 Perangkap 1: Kemas kini pangkalan data dahulu, kemudian kemas kini cache🎜🎜Jika terdapat dua 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. 🎜🎜Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?🎜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 2Kemas kini pangkalan data dan kemas kini medan umur kepada 20;🎜

(3)Tulis permintaan 2Kemas kini cache , umur cache ditetapkan kepada 20; 写请求2更新缓存,缓存 age 设置为20;

(4)写请求1更新缓存,缓存 age 设置为18;

执行完预期结果是数据库 age 为20,缓存 age 为20,结果缓存 age为18,这就造成了缓存数据不是最新的,出现了脏数据。

踩坑二:先删缓存,再更新数据库

如果写请求的处理流程是先删缓存再更新数据库,在一个读请求和一个写请求并发场景下可能会出现数据不一致情况。

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
先删缓存,再更新数据库

如上图的执行过程:

(1)写请求删除缓存数据;

(2)读请求查询缓存未击中(Hit Miss),紧接着查询数据库,将返回的数据回写到缓存中;

(3)写请求

(4) 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. 🎜
Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Padam cache dahulu, kemudian kemas kini pangkalan data
🎜Proses pelaksanaan seperti yang ditunjukkan di atas:🎜🎜(1)Tulis permintaanPadam 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>CacheUmur ialah 18, cache Ia tidak konsisten dengan data pangkalan data dan data kotor muncul dalam cache. 数据库中age为20,缓存中age为18,缓存和数据库数据不一致,缓存出现了脏数据。

踩坑三:先更新数据库,再删除缓存

在实际的系统中针对写请求还是推荐先更新数据库再删除缓存,但是在理论上还是存在问题,以下面这个例子说明。

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
先更新数据库,再删除缓存

如上图的执行过程:

(1)读请求先查询缓存,缓存未击中,查询数据库返回数据;

(2)写请求更新数据库,删除缓存;

(3)读请求回写缓存;

整个流程操作下来发现数据库age为20缓存age为18

Pitfall 3: Kemas kini pangkalan data dahulu, kemudian padamkan cache

Dalam sistem sebenar, Tulis permintaan atau disyorkanKemas kini pangkalan data dahulu dan kemudian padamkan cache, tetapi masih terdapat masalah dalam teori, seperti yang ditunjukkan dalam contoh berikut. 🎜
Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Kemas kini pangkalan data dahulu, kemudian padamkan cache
🎜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. 缓存数据设置过期时间。通常在系统中是可以允许少量的数据短时间不一致的场景出现。

Read through

在 Cache Aside 更新模式中,应用代码需要维护两个数据源头:一个是缓存,一个是数据库。而在 Read-Through 策略下,应用程序无需管理缓存和数据库,只需要将数据库的同步委托给缓存提供程序 Cache Provider 即可。所有数据交互都是通过抽象缓存层完成的。

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Read-Through流程

如上图,应用程序只需要与Cache Provider交互,不用关心是从缓存取还是数据库。

在进行大量读取时,Read-Through 可以减少数据源上的负载,也对缓存服务的故障具备一定的弹性。如果缓存服务挂了,则缓存提供程序仍然可以通过直接转到数据源来进行操作。

Read-Through 适用于多次请求相同数据的场景

Baca hingga

Dalam mod kemas kini Cache Aside, kod aplikasi perlu mengekalkan dua Terdapat dua sumber data: satu ialah cache dan satu lagi adalah pangkalan data. Dan dalam 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 . 🎜
Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Proses Baca Lalu
🎜Seperti yang ditunjukkan di atas, aplikasi hanya perlu dipadankan dengan Pembekal Cacheinteraksi, 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: 🎜
  • Dalam Cache-Aside, aplikasi bertanggungjawab untuk mendapatkan data daripada sumber data dan mengemas kininya ke cache.
  • Dalam Baca-Terus, logik ini biasanya disokong oleh penyedia cache bebas (Penyedia Cache).

Tulis melalui

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类似一个代理的作用。

Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Write-Through流程

Write behind

Write behind在一些地方也被成为Write back, 简单理解就是:应用程序更新数据时只更新缓存, Cache Provider每隔一段时间将数据刷新到数据库中。说白了就是延迟写入

Cache konsisten dengan sumber data dan menulis sentiasa lulus -color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(0, 0, 153); ">Lapisan cache abstrak mencapai sumber data. 🎜🎜Pembekal Cache berfungsi seperti proksi . 🎜
Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Proses Tulis Melalui
🎜🎜🎜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 . 🎜
Dalam senario konkurensi tinggi, adakah cache atau pangkalan data perlu dikemas kini terlebih dahulu?
Write behind process

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.

Untuk meringkaskan
  • Selepas belajar begitu banyak, saya percaya semua orang mempunyai pemahaman yang jelas tentang strategi kemas kini cache. Akhir sekali, sedikit ringkasan.
    Terdapat tiga strategi utama untuk kemas kini cache:
  • Kesampingkan cache
  • Baca/Tulis melalui

Tulis di belakang

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!

Kenyataan:
Artikel ini dikembalikan pada:Java学习指南. Jika ada pelanggaran, sila hubungi admin@php.cn Padam