Objek yang berinteraksi dengan kejadian Redis dan operasi yang berlaku semasa interaksi:
Pelanggan: rangkaian IO, nilai kunci Sebagai tambahan, operasi pemadaman, pengubahsuaian dan pertanyaan, operasi pangkalan data; slave Node: Pustaka utama menjana dan menghantar fail RDB, menerima fail RDB daripada pustaka, mengosongkan pangkalan data dan memuatkan fail RDB
Menghiris contoh kluster: menghantar maklumat slot cincang kepada yang lain; contoh, migrasi data .
Hubungan antara 4 jenis objek interaktif dan operasi khusus:
bukan faktor yang menyebabkan Redis menyekat.
Tugas utama utas utama Redis adalah untuk melaksanakan operasi penambahan, pemadaman, pengubahsuaian dan pertanyaan pasangan nilai kunci yang berinteraksi dengan klien. Operasi tambah, padam, ubah suai dan pertanyaan yang sangat kompleks pasti akan menyekat Redis. Kriteria untuk menilai kerumitan operasi: lihat sama ada
kerumitan operasi ialah O(N). Titik sekatan pertama Redis: pertanyaan koleksi penuh dan operasi pengagregatan:
Kerumitan operasi yang melibatkan koleksi dalam Redis biasanya O(N), jadi anda perlu memberi perhatian apabila menggunakannya .
Contohnya, elemen tetapkanpertanyaan penuh operasi HGETALL, SMEMBERS dan statistik pengagregatan
operasi set, seperti persilangan, kesatuan dan perbezaan. Titik sekatan kedua Redis: operasi pemadaman kunci besar
Operasi pemadaman koleksi itu sendiri juga mempunyai potensi risiko menyekat. Intipati operasi pemadaman adalah untuk melepaskan ruang memori yang diduduki oleh pasangan nilai kunci. Melepaskan memori hanyalah langkah pertama Untuk mengurus ruang memori dengan lebih cekap, apabila aplikasi mengeluarkan memori, sistem pengendalian perlu memasukkan blok memori yang dikeluarkan ke dalam senarai terpaut blok memori percuma untuk pengurusan dan pengagihan semula seterusnya. Proses ini sendiri mengambil masa tertentu dan akan menyekat aplikasi yang sedang mengeluarkan memori Jika sejumlah besar memori dikeluarkan serentak, masa operasi senarai terpaut blok memori percuma akan meningkat, yang akan sewajarnya menyebabkan utas utama Redis disekat. Masa untuk melepaskan sejumlah besar memori: Apabila memadamkan sejumlah besar pasangan nilai kunci, memadamkan koleksi yang mengandungi sejumlah besar elemen juga dipanggil
.
Masa yang digunakan dalam operasi pemadaman untuk koleksi dengan bilangan elemen yang berbeza:
Tiga kesimpulan dibuat:
Apabila bilangan elemen meningkat daripada 100,000 kepada 1 juta, masa pemadaman empat jenis koleksi utama meningkat daripada 5 kali kepada hampir 20 kali ganda;Apabila memadamkan set yang mengandungi 1 juta elemen, masa pemadaman maksimum jenis Hash telah mencapai nilai mutlak 1.98 saat. Dalam keadaan biasa, masa tindak balas Redis berada pada tahap mikrosaat, tetapi jika operasi mengambil masa hampir 2 saat untuk dilaksanakan, ia akan menyekat utas utama, yang tidak dapat dielakkan.
Memandangkan pemadaman kerap pasangan nilai kunci merupakan titik sekatan yang berpotensi, dalam operasi peringkat pangkalan data Redis, Membilas pangkalan data (seperti operasi FLUSHDB dan FLUSHALL) juga merupakan potensi risiko menyekat kerana ia melibatkan pemadaman dan pelepasan semua pasangan nilai kunci.
IO Cakera secara amnya memakan masa dan intensif buruh serta memerlukan perhatian khusus. Pembangun Redis telah lama menyedari bahawa cakera IO boleh menyebabkan penyekatan, jadi Redis direka bentuk untuk menggunakan sub-proses untuk menjana fail syot kilat RDB dan melaksanakan operasi penulisan semula log AOF. Proses anak bertanggungjawab untuk pelaksanaan, dan IO cakera perlahan tidak akan menyekat utas utama.
Titik sekatan kelima Redis: memuatkan fail RDB daripada pustaka hamba
Semasa proses penyalinan pustaka utama,
mencipta dan memindahkan fail RDB dilengkapkan dengan sub-prosesdan tidak akan menyekat urutan utama.
Tetapi selepas menerima fail RDB, perpustakaan hamba perlu menggunakan arahan FLUSHDB untuk mengosongkan pangkalan data semasa, yang kebetulan mencecah titik sekatan ketiga. Selepas mengosongkan pangkalan data semasa, perpustakaan hamba perlu memuatkan fail RDB ke dalam ingatan Kelajuan proses ini berkait rapat dengan saiz fail RDB, semakin perlahan proses pemuatan.Apabila menggunakan gugusan penghirisan Redis, maklumat slot cincang yang diperuntukkan pada setiap tika Redis perlu dipindahkan antara tika yang berbeza Apabila pengimbangan beban diperlukan atau apabila terdapat penambahan atau pemadaman contoh, data akan dipindahkan antara kejadian yang berbeza. Walau bagaimanapun, jumlah maklumat dalam slot cincang tidak besar, dan pemindahan data dilakukan secara beransur-ansur. Kedua-dua jenis operasi ini mempunyai risiko yang kecil untuk menyekat urutan utama Redis.
Jika penyelesaian Redis Cluster digunakan dan bigkey dipindahkan pada masa yang sama, utas utama akan disekat kerana Redis Cluster menggunakan migrasi segerak.
Lima mata sekatan:
Tetapkan pertanyaan penuh dan operasi pengagregatan;
Kosongkan pangkalan data;
Tulisan segerak log AOF;
Muat fail RDB daripada perpustakaan .
2. Titik sekatan yang boleh dilaksanakan secara tak segerak
Keperluan untuk pelaksanaan operasi tak segerak:
Operasi yang boleh dilaksanakan secara tak segerak bukanlah operasi pada laluan kritikal utas utama Redis (selepas pelanggan menghantar permintaan kepada Redis, ia menunggu operasi Redis yang mengembalikan hasil data).
Selepas utas utama menerima operasi 1, operasi 1 tidak perlu memulangkan data khusus kepada klien Urusan utama boleh menyerahkannya kepada sub-utas latar belakang selesai. Pada masa yang sama, selagi Hanya kembalikan hasil "OK" kepada pelanggan.Apabila urutan kanak-kanak menjalankan operasi 1, pelanggan menghantar operasi 2 kepada tika Redis Pelanggan perlu menggunakan hasil data yang dikembalikan oleh operasi 2. Jika operasi 2 tidak mengembalikan hasil, pelanggan akan sentiasa menunggu. negeri.
Operasi 1 tidak dianggap sebagai operasi pada laluan kritikal, kerana ia tidak perlu mengembalikan data khusus kepada klien, jadi ia boleh dilaksanakan secara tak segerak oleh sub-benang latar belakang.Operasi 2 perlu mengembalikan hasilnya kepada klien Ia adalah operasi pada laluan kritikal, jadi utas utama mesti menyelesaikan operasi ini dengan segera.
Operasi baca Redis ialah operasi laluan kritikal yang tipikal, kerana selepas klien menghantar operasi baca, ia akan menunggu sehingga data baca dikembalikan untuk pemprosesan data seterusnya. Titik sekatan pertama Redis, "mengumpul pertanyaan penuh dan operasi pengagregatan", kedua-duanya melibatkan operasi baca dan operasi tak segerak tidak boleh dilakukan.
Padam operasi yang tidak memerlukan keputusan data khusus untuk dikembalikan kepada klien bukanlah operasi laluan kritikal. "Kedua-dua 'pemadaman kunci besar' dan 'pembersihan pangkalan data' melibatkan pemadaman data, tetapi mereka tidak berada di laluan kritikal.". Anda boleh menggunakan sub-benang latar belakang untuk melaksanakan operasi pemadaman secara tidak segerak.
"Tulisan segerak log AOF". Untuk memastikan kebolehpercayaan data, tika Redis perlu memastikan bahawa rekod operasi dalam log AOF telah diletakkan pada cakera Walaupun operasi ini memerlukan contoh untuk menunggu, ia tidak Keputusan data tertentu akan dikembalikan kepada contoh. Oleh itu, benang kanak-kanak boleh dimulakan untuk melakukan penulisan segerak log AOF.
Untuk menyediakan perkhidmatan akses data kepada pelanggan, fail RDB yang lengkap mesti dimuatkan. Operasi ini juga merupakan operasi pada laluan kritikal dan mesti dilaksanakan oleh utas utama perpustakaan hamba.
Kecuali untuk "pengumpulan pertanyaan penuh dan operasi pengagregatan" dan "memuatkan fail RDB dari pustaka", operasi yang terlibat dalam tiga titik sekatan yang lain tidak berada di laluan kritikal gunakan subrutin tak segerak Redis digunakan untuk melaksanakan pemadaman kunci besar, pangkalan data kosong dan penulisan segerak log AOF.
Selepas utas utama Redis dimulakan, ia akan menggunakan fungsi pthread_create yang disediakan oleh sistem pengendalian untuk mencipta 3 sub-benang, bertanggungjawab untuk
Operasi penulisan log AOF, pasangan nilai kunci Pelaksanaan pemadaman tidak segerak dan penutupan failUrut utama berinteraksi dengan urutan anak melalui baris gilir tugas dalam bentuk senarai terpaut. Apabila menerima operasi pemadaman pasangan nilai kunci dan mengosongkan pangkalan data, utas utama akan merangkum operasi itu ke dalam tugasan, memasukkannya ke dalam baris gilir tugasan, dan kemudian mengembalikan mesej penyelesaian kepada klien, menunjukkan bahawa pemadaman telah selesai.
Tetapi sebenarnya, pemadaman masih belum dilaksanakan pada masa ini Selepas sub-utas latar belakang membaca tugasan daripada baris gilir tugas, pasangan nilai kunci sebenarnya dipadamkan dan ruang memori yang sepadan dikeluarkan. . Pemadaman tak segerak ini juga dipanggil
pemadaman malas(percuma malas).
Apabila log AOF dikonfigurasikan dengan pilihan everysec, utas utama akan merangkum operasi penulisan log AOF ke dalam tugasan dan meletakkannya dalam baris gilir tugas. Satu cara untuk menulis semula ialah: Apabila sub-benang latar belakang membaca tugas, ia mula merakam ke log AOF dengan sendirinya dan utas utama boleh terus berjalan tanpa bergantung pada log AOF. Mekanisme pelaksanaan sub-benang tak segerak dalam Redis:
Pemadaman pasangan nilai kunci tak segerak dan operasi pembersihan pangkalan data adalah fungsi yang disediakan selepas Redis 4.0 Redis juga menyediakan arahan baharu untuk melaksanakan dua operasi ini:
Pemadaman pasangan nilai kunci: Apabila. terdapat sejumlah besar elemen dalam jenis koleksi (contohnya, terdapat berjuta-juta atau berpuluh-puluh juta elemen) yang perlu dipadamkan, disyorkan untuk menggunakan arahan UNLINK; 🎜>Kosongkan pangkalan data: anda boleh menggunakan arahan FLUSHDB dan FLUSHALL Kemudian tambahkan pilihan ASYNC untuk membenarkan sub-benang latar belakang mengosongkan pangkalan data secara tidak segerak.
FLUSHDB ASYNC FLUSHALL AYSNC
Atas ialah kandungan terperinci Apakah mekanisme tak segerak Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!