Rumah  >  Artikel  >  pangkalan data  >  Apakah lapan masalah klasik Redis?

Apakah lapan masalah klasik Redis?

王林
王林ke hadapan
2023-06-03 14:44:481246semak imbas

1. Mengapa menggunakan Redis

Blogger percaya bahawa pertimbangan utama untuk menggunakan redis dalam projek adalah prestasi dan keselarasan. Sudah tentu, redis juga mempunyai fungsi lain seperti kunci yang diedarkan, tetapi jika ia hanya untuk fungsi lain seperti kunci yang diedarkan, terdapat perisian tengah lain (seperti zookpeer, dll.) sebaliknya, dan tidak perlu menggunakan redis. Oleh itu, soalan ini dijawab terutamanya dari dua perspektif: prestasi dan konkurensi.

Jawapan: Seperti yang ditunjukkan di bawah, dibahagikan kepada dua mata

(1) Prestasi

Apabila masa pelaksanaan diperlukan Bila SQL adalah sangat panjang dan hasilnya tidak kerap berubah, kami mengesyorkan menyimpan keputusan dalam cache. Dengan cara ini, permintaan seterusnya akan dibaca daripada cache, supaya permintaan boleh dijawab dengan cepat.

Apakah lapan masalah klasik Redis?

Luar topik: Saya tiba-tiba ingin bercakap tentang standard respons pantas ini. Malah, bergantung pada kesan interaksi, tiada piawaian tetap untuk masa tindak balas ini. Tetapi seseorang pernah memberitahu saya: "Dalam dunia yang ideal, lompatan halaman kami perlu diselesaikan dalam sekelip mata, dan operasi dalam halaman perlu diselesaikan dengan segera. Untuk memberikan pengalaman pengguna yang terbaik, operasi yang mengambil masa lebih daripada satu saat harus diberikan gesaan Kemajuan dan membenarkan penggantungan atau pembatalan pada bila-bila masa "

Jadi berapa lama masa yang diambil dalam sekelip mata, sekejap atau sekejap?

Menurut rekod "Maha Sangha Vinaya"

Satu saat adalah satu pemikiran, dua puluh pemikiran adalah satu saat, dua puluh saat adalah satu jentikan jari, dua puluh jentikan jari adalah satu Luo Su, dua puluh Luo Ramalan awal adalah satu saat, satu hari dan satu malam adalah tiga puluh saat.

Jadi, selepas pengiraan yang teliti, sesaat ialah 0.36 saat, sesaat ialah 0.018 saat, dan satu petik jari ialah 7.2 saat.

(2) Concurrency

Seperti yang ditunjukkan dalam rajah di bawah, dalam kes concurrency yang besar, semua permintaan mengakses terus pangkalan data, dan pengecualian sambungan akan berlaku dalam pangkalan data. Dalam kes ini, menggunakan operasi penimbalan Redis adalah perlu supaya permintaan terlebih dahulu mengakses Redis dan bukannya mengakses pangkalan data secara langsung.

Apakah lapan masalah klasik Redis?

2. Apakah keburukan menggunakan Redis? mesti difahami pada asasnya, anda akan menghadapi beberapa masalah apabila menggunakan redis, dan terdapat hanya beberapa masalah biasa.

Jawapan: Terutamanya empat soalan

(1) Masalah ketekalan tulis dua cache dan pangkalan data

(2) Masalah runtuhan cache

(3) Masalah kerosakan cache

(4) Masalah perbalahan koncurrency cache

Ini saya sendiri rasa empat masalah ini agak biasa dalam projek Penyelesaian khusus diberikan di bawah.

Anda boleh merujuk kepada: "Cache avalanche, penembusan cache, cache preheating, cache update, cache degradation and other issues! 》

3. Mengapakah Redis berbenang tunggal begitu pantas?

Analisis: Soalan ini sebenarnya adalah penyiasatan tentang mekanisme dalaman redis. Mengikut pengalaman temu bual penulis blog, ramai orang sebenarnya tidak memahami model kerja single-threaded Redis. Oleh itu, isu ini masih harus dikaji semula.

Jawapan: Terutamanya tiga perkara berikut

(1) Operasi memori tulen

(2) Operasi satu benang, mengelakkan penukaran konteks yang kerap

Mod Perniagaan 1

Setiap kali pelanggan menghantar kurier, Xiaoqu akan menugaskan kurier untuk mengawasinya, dan kemudian kurier akan memandu untuk menghantar kurier . Perlahan-lahan Xiaoqu menemui masalah berikut dengan kaedah perniagaan ini

Puluhan kurier pada dasarnya menghabiskan masa mereka merompak kereta, dan kebanyakan kurir menghadapi masalah dalam keadaan terbiar, sesiapa yang mengambil kereta itu boleh menghantar kurier

Apabila bilangan kurier bertambah, begitu juga kurier mendapati kedai kurier semakin sesak , tidak ada cara untuk mengupah kurier baharu
  • Penyelarasan antara kurier sangat memakan masa
  • Berdasarkan kekurangan di atas, Xiaoqu belajar daripada pengalaman dan mencadangkan Kaedah perniagaan berikut adalah pakai
  • Mod perniagaan dua

Xiaoqu hanya mengupah satu kurier. Xiaoqu akan menandakan penghantaran ekspres yang dihantar oleh pelanggan mengikut lokasi penghantaran dan meletakkannya di tempat yang sama. Akhirnya, kurier mengambil bungkusan satu demi satu, kemudian memandu untuk menghantar bungkusan, dan kemudian kembali untuk mengambil bungkusan seterusnya selepas penghantaran.

Perbandingan

Membandingkan dua kaedah perniagaan di atas, adakah jelas bahawa kaedah kedua lebih cekap dan lebih baik? Dalam metafora di atas:

Setiap kurier -------------------> Setiap utas

Setiap ekspres --------------------> Setiap soket (strim I/O)
  • Lokasi penghantaran ekspres penghantaran --------------> Status soket yang berbeza
  • Permintaan pelanggan untuk penghantaran ekspres-------------->Permintaan daripada pelanggan

  • Kaedah perniagaan Xiaoqu- - ------------>Kod berjalan pada pelayan

  • Sebuah kereta---------------- -- ----->Bilangan teras CPU

Jadi kami mempunyai kesimpulan berikut

1 Kaedah perniagaan pertama ialah model konkurensi tradisional, setiap I /. Strim O (Express) diuruskan oleh utas baharu (Expressor).

2. Kaedah pengurusan kedua ialah pemultipleksan I/O. Hanya terdapat satu utas (kurier) yang menguruskan berbilang aliran I/O dengan menjejak status setiap aliran I/O (lokasi penghantaran setiap kurier).

Berikut adalah analogi kepada model benang redis sebenar, seperti yang ditunjukkan dalam rajah

Apakah lapan masalah klasik Redis?

Rujuk rajah di atas, secara ringkasnya, ia ialah. Semasa operasi, pelanggan Redis kami akan mencipta soket dengan jenis acara yang berbeza. Di bahagian pelayan, terdapat program pemultipleksan I/0 yang meletakkannya dalam baris gilir. Kemudian, penghantar acara fail mengambilnya dari baris gilir dan memajukannya kepada pemproses acara yang berbeza.

Perlu diambil perhatian bahawa untuk mekanisme pemultipleksan I/O ini, redis juga menyediakan perpustakaan fungsi pemultipleksan seperti pilih, epoll, evport dan kqueue Anda boleh mempelajarinya sendiri.

4. Jenis data Redis dan senario penggunaan setiap jenis data

Analisis: Adakah anda fikir soalan ini sangat asas? Walau bagaimanapun, mengikut pengalaman temu duga, sekurang-kurangnya 80% orang tidak dapat menjawab soalan ini. Adalah disyorkan bahawa selepas menggunakannya dalam projek, anda boleh menghafalnya dengan analogi untuk mendapatkan pengalaman yang lebih mendalam dan bukannya menghafalnya dengan hati. Pada asasnya, pengaturcara yang berkelayakan akan menggunakan semua lima jenis.

Jawapan: Terdapat lima jenis

(1) Rentetan

Ini sebenarnya sangat biasa, melibatkan operasi dapatkan/set yang paling asas, nilai boleh menjadi String atau nombor. Secara amnya, beberapa fungsi pengiraan kompleks dicache.

(2)cincang

Nilai di sini menyimpan objek berstruktur dan lebih mudah untuk mengendalikan salah satu medan. Apabila blogger melakukan log masuk tunggal, mereka menggunakan struktur data ini untuk menyimpan maklumat pengguna, menggunakan cookieId sebagai kunci dan menetapkan 30 minit sebagai masa tamat tempoh cache, yang boleh mensimulasikan kesan seperti sesi dengan baik.

(3) senarai

Menggunakan struktur data Senarai, anda boleh melaksanakan fungsi baris gilir mesej ringkas. Selain itu, kami juga boleh menggunakan perintah lrange untuk melaksanakan fungsi paging berasaskan Redis Kaedah ini mempunyai prestasi dan pengalaman pengguna yang sangat baik.

(4) set

Kerana set ialah koleksi nilai unik. Oleh itu, fungsi deduplikasi global boleh dilaksanakan. Mengapa tidak menggunakan Set yang disertakan dengan JVM untuk penyahduplikasian? Kerana sistem kami biasanya digunakan dalam kelompok, adalah menyusahkan untuk menggunakan Set yang disertakan dengan JVM Adakah terlalu menyusahkan untuk menyediakan perkhidmatan awam hanya untuk melakukan penduaan global?

Selain itu, dengan menggunakan persilangan, kesatuan, perbezaan dan operasi lain, anda boleh mengira pilihan biasa, semua pilihan, pilihan unik anda sendiri dan fungsi lain.

(5) set diisih

set diisih mempunyai skor parameter berat tambahan, dan elemen dalam set boleh disusun mengikut skor. Anda boleh membuat aplikasi ranking dan mengambil operasi TOP N. Di samping itu, dalam artikel bertajuk "Analisis Skim Tugasan Tertunda Teragih", disebutkan bahawa set diisih boleh digunakan untuk melaksanakan tugas tertunda. Aplikasi terakhir adalah untuk melakukan carian julat.

5. Strategi tamat tempoh Redis dan mekanisme penghapusan ingatan

Kepentingan isu ini adalah jelas dan dapat dilihat sama ada Redis digunakan. Contohnya, jika anda hanya boleh menyimpan 5 GB data dalam Redis, tetapi anda menulis 10 GB data, 5 GB data akan dipadamkan. Bagaimana anda memadamkannya? Selain itu, data anda telah menetapkan masa tamat tempoh, tetapi apabila masa tamat, penggunaan memori masih agak tinggi. Pernahkah anda memikirkan sebabnya

Jawapan:

Redis menggunakan pemadaman biasa. + Strategi pemadaman malas.

Mengapa tidak menggunakan strategi pemadaman berjadual

Pemadaman berjadual, gunakan pemasa untuk memantau kunci dan padamkannya secara automatik apabila tamat tempoh. Walaupun memori dikeluarkan dalam masa, ia menggunakan banyak sumber CPU. Memandangkan di bawah permintaan serentak yang tinggi, CPU perlu menumpukan pada pemprosesan permintaan dan bukannya operasi pemadaman nilai utama, kami berputus asa menggunakan strategi ini

Bagaimanakah pemadaman biasa + pemadaman malas berfungsi?

Padam secara tetap Redis menyemak setiap 100ms secara lalai untuk melihat jika terdapat kunci tamat tempoh, padamkannya. Perlu diingat bahawa redis tidak menyemak semua kekunci setiap 100ms, tetapi memilihnya secara rawak untuk pemeriksaan (jika semua kekunci disemak setiap 100ms, bukankah redis akan tersekat)? Jika anda hanya menggunakan strategi pemadaman berkala, banyak kunci tidak akan dipadamkan selepas masa tamat tempoh.

Jadi, pemadaman malas berguna. Maksudnya, apabila anda mendapat kunci, redis akan menyemak sama ada kunci telah tamat tempoh jika ia mempunyai masa tamat tempoh yang ditetapkan? Jika ia tamat tempoh, ia akan dipadamkan pada masa ini.

Adakah tiada masalah lain jika kita mengamalkan pemadaman biasa + pemadaman malas?

Tidak, jika kunci tidak dipadamkan jika ia dipadamkan dengan kerap. Kemudian anda tidak meminta kunci serta-merta, yang bermaksud pemadaman malas tidak berkuat kuasa. Dengan cara ini, ingatan redis akan menjadi lebih tinggi dan lebih tinggi. Kemudian mekanisme penghapusan ingatan harus diguna pakai.

Terdapat baris konfigurasi dalam redis.conf

# maxmemory-policy volatile-lru

Konfigurasi ini dikonfigurasikan dengan strategi penghapusan memori (apa, anda tidak mempunyai' t mengkonfigurasinya? Okay Refleksi pada diri sendiri)

1) noeviction: Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, operasi tulis baharu akan melaporkan ralat. Tiada siapa yang harus menggunakannya.

Apabila ruang memori tidak mencukupi untuk menyimpan data baharu, algoritma allkeys-lru akan mengalih keluar kunci yang paling kurang digunakan baru-baru ini daripada ruang kunci. Disyorkan, sedang digunakan dalam projek.

3) allkeys-random: Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, kunci dialih keluar secara rawak daripada ruang kunci. Tiada siapa yang sepatutnya menggunakannya Jika anda tidak mahu memadamkannya, sekurang-kurangnya gunakan Kekunci dan padamkannya secara rawak.

4) volatile-lru: Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, dalam ruang kekunci dengan set masa tamat, kunci yang paling kurang digunakan baru-baru ini dialih keluar. Secara amnya, kaedah ini hanya digunakan apabila redis digunakan sebagai kedua-dua cache dan storan berterusan. Tidak disyorkan

5) rawak meruap: Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, kunci dialih keluar secara rawak daripada ruang kunci dengan masa tamat tempoh ditetapkan. Masih tidak disyorkan

6) volatile-ttl: Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, dalam ruang kunci dengan masa tamat tempoh ditetapkan, kunci dengan masa tamat tempoh lebih awal akan dialih keluar terlebih dahulu. Tidak disyorkan

ps: Jika kunci tamat tempoh tidak ditetapkan dan prasyarat tidak dipenuhi maka kelakuan strategi volatile-lru, volatile-random dan volatile-ttl pada dasarnya adalah sama seperti noeviction (tidak dipadamkan) .

6. Isu ketekalan tulis dua kali redis dan pangkalan data

Dalam sistem teragih, isu konsistensi adalah masalah biasa. Masalah ini boleh dibezakan lagi kepada konsistensi akhirnya dan konsistensi yang kuat. Jika pangkalan data dan cache ditulis dua kali, pasti akan ada ketidakkonsistenan. Untuk menjawab soalan ini, fahami premis terlebih dahulu. Iaitu, jika terdapat keperluan konsistensi yang kuat untuk data, ia tidak boleh dicache. Semua yang kami lakukan hanya boleh menjamin konsistensi akhirnya. Penyelesaian yang kami cadangkan sebenarnya hanya boleh mengurangkan kebarangkalian kejadian yang tidak konsisten, tetapi tidak boleh menghapuskannya sepenuhnya. Oleh itu, data dengan keperluan konsistensi yang kukuh tidak boleh dicache.

Berikut ialah pengenalan ringkas kepada analisis terperinci dalam artikel "Analisis Pangkalan Data Teragih dan Skim Konsistensi Tulis Dua Cache". Mula-mula, pakai strategi kemas kini yang betul, kemas kini pangkalan data dahulu, dan kemudian padamkan cache. Sediakan langkah sandaran, seperti menggunakan baris gilir mesej, sekiranya pemadaman cache gagal.

7. Cara menangani masalah penembusan cache dan salji cache

Syarikat perisian tradisional bersaiz kecil dan sederhana jarang menghadapi dua masalah ini, sejujurnya. Jika terdapat projek serentak yang besar, trafik akan menjadi sekitar berjuta-juta. Kedua-dua isu ini mesti dipertimbangkan secara mendalam.

Jawapan: Seperti yang ditunjukkan di bawah

Penembusan cache, iaitu, penggodam sengaja meminta data yang tidak wujud dalam cache, menyebabkan semua permintaan dihantar ke pangkalan data , oleh itu pengecualian sambungan pangkalan data.

Penyelesaian:

Apabila cache gagal, gunakan kunci mutex untuk memperoleh kunci dahulu, dan kemudian minta pangkalan data sebaik sahaja kunci diperoleh. Jika kunci tidak diperoleh, kemudian tidur untuk tempoh masa dan cuba lagi

(2) Gunakan strategi kemas kini tak segerak dan kembali terus tanpa mengira sama ada kunci itu mempunyai nilai. Simpan masa tamat cache dalam nilai nilai Setelah cache tamat tempoh, benang akan dimulakan secara tidak segerak untuk membaca pangkalan data dan mengemas kini cache. Operasi prapemanasan cache (memuatkan cache sebelum memulakan projek) diperlukan.

Menyediakan mekanisme pemintasan yang boleh menentukan dengan cepat sama ada permintaan itu sah. Contohnya, gunakan penapis Bloom untuk mengekalkan siri kunci yang sah dan sah secara dalaman. Tentukan dengan cepat sama ada Kunci yang dibawa dalam permintaan itu sah dan sah. Kalau haram balik terus.

Cache avalanche, iaitu, cache gagal di kawasan yang besar pada masa yang sama Pada masa ini, gelombang permintaan lain datang, dan akibatnya, semua permintaan dihantar ke pangkalan data, mengakibatkan. sambungan pangkalan data yang tidak normal.

Penyelesaian:

(1) Tambahkan nilai rawak pada masa tamat tempoh cache untuk mengelakkan kegagalan kolektif.

(2) Gunakan kunci mutex, tetapi daya pemprosesan penyelesaian ini menurun dengan ketara.

(3) Penimbalan berganda. Kami mempunyai dua cache, cache A dan cache B. Masa tamat tempoh cache A ialah 20 minit, dan tiada masa tamat tempoh untuk cache B. Lakukan sendiri operasi pemanasan cache. Kemudian pecahkan perkara berikut

  • Saya membaca pangkalan data daripada cache A, dan kembali terus jika ada

  • II A tidak mempunyai data , jadi ia kembali terus daripada cache A B membaca data, kembali terus dan memulakan urutan kemas kini secara tidak segerak.

  • III Urutan kemas kini mengemas kini cache A dan cache B pada masa yang sama.

8 Bagaimana untuk menyelesaikan masalah persaingan utama serentak dalam Redis

Analisis: Masalah ini secara kasarnya ialah terdapat berbilang subsistem yang menetapkan kunci pada masa yang sama. Apakah yang perlu kita perhatikan pada masa ini? Pernahkah anda memikirkannya? Selepas menyemak hasil carian Baidu terlebih dahulu, penulis blog mendapati hampir semua jawapan disyorkan menggunakan mekanisme transaksi redis. Blogger tidak mengesyorkan menggunakan mekanisme transaksi redis. Oleh kerana persekitaran pengeluaran kami pada asasnya ialah persekitaran kluster redis, operasi perkongsian data dilakukan. Apabila satu tugasan melibatkan berbilang operasi kunci, kunci ini tidak semestinya disimpan pada pelayan Redis yang sama. Oleh itu, mekanisme transaksi redis sangat tidak berguna.

Jawapan: Seperti yang ditunjukkan di bawah

(1) Jika anda mengendalikan kunci ini, pesanan tidak diperlukan

Dalam kes ini, sediakan diedarkan Untuk kunci, semua orang mengambil kunci Setelah anda mengambil kunci, lakukan sahaja operasi yang ditetapkan.

(2) Jika anda mengendalikan kunci ini, urutan yang diperlukan ialah

Andaikan terdapat kunci1, sistem A perlu menetapkan kunci1 kepada nilaiA, sistem B perlu menetapkan kunci1 kepada nilaiB dan sistem C perlu menetapkan kunci1 kepada nilaiB.kunci1 ditetapkan kepada nilaiC

menjangkakan nilai kunci1 akan berubah dalam susunan nilaiA-->nilaiB-->nilaiC. Pada masa ini, kita perlu menyimpan cap masa semasa menulis data ke pangkalan data. Andaikan cap masa adalah seperti berikut: 10}

Bayangkan jika sistem B memperoleh kunci terlebih dahulu, ia akan menetapkan nilai kunci1 kepada {valueB 3:05}. Apabila sistem A memperoleh kunci, jika ia mendapati bahawa cap masa nilaiA yang disimpannya lebih awal daripada cap masa yang disimpan dalam cache, sistem A tidak akan melaksanakan operasi yang ditetapkan. Dan seterusnya.

Kaedah lain, seperti menggunakan baris gilir dan menukar kaedah yang ditetapkan kepada akses bersiri, juga boleh digunakan. Pendek kata, bersikap fleksibel.

Atas ialah kandungan terperinci Apakah lapan masalah klasik Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam