Rumah > pangkalan data > Redis > teks badan

Analisis ringkas model satu benang dan berbilang benang dalam Redis6

青灯夜游
Lepaskan: 2022-01-26 10:38:02
ke hadapan
3327 orang telah melayarinya

Artikel ini akan membawa anda memahami model benang dalam Redis6 dan memperkenalkan model benang tunggal dan model berbilang benang, saya harap ia akan membantu anda!

Analisis ringkas model satu benang dan berbilang benang dalam Redis6

1. Sejarah evolusi Redis

Jika anda hanya mengatakan bahawa redis adalah satu benang atau berbilang benang, jawapan ini ialah pastinya tidak ketat Model benang yang digunakan oleh versi yang berbeza adalah berbeza. [Pengesyoran berkaitan: Tutorial video Redis]

Analisis ringkas model satu benang dan berbilang benang dalam Redis6

  • Versi 3.x, versi terawal, yang disebarkan oleh semua orang dari mulut ke mulut redis adalah berulir tunggal.

  • Versi 4.x, sebenarnya, bukan satu-benang, tetapi urutan yang bertanggungjawab untuk memproses permintaan pelanggan adalah satu-benang, tetapi ia mula menambah sedikit 多线程的东西(异步删除).

  • Selepas versi terbaharu 6.0.x, kami mengucapkan selamat tinggal kepada urutan tunggal dalam tanggapan semua orang dan menggunakan 多线程 serba baharu untuk menyelesaikan masalah.

2. Model benang tunggal Redis

2.1 Maksud sebenar benang tunggal

Terutamanya bermakna bahawa rangkaian IO dan pasangan nilai kunci membaca dan menulis dilengkapkan oleh utas Apabila Redis memproses permintaan pelanggan, ia termasuk pemerolehan (bacaan soket), penghuraian, pelaksanaan, pengembalian kandungan (soket. penulisan), dsb. Diproses oleh utas utama berurutan, ini dipanggil "benang tunggal". Ini juga merupakan proses utama untuk Redis menyediakan perkhidmatan storan nilai kunci luaran. Analisis ringkas model satu benang dan berbilang benang dalam Redis6
Tetapi fungsi lain Redis, seperti kekekalan, pemadaman tak segerak, penyegerakan data kelompok, dll., sebenarnya dilaksanakan oleh 额外的线程. , Boleh dikatakan bahawa Redisbenang pekerja adalah satu-benang. Walau bagaimanapun, 整个Redis来说,是多线程的;

2.2 Sebab prestasi benang tunggal yang pantas

Redis 3.x era benang tunggal tetapi 性能很快的主要原因 :

  • Operasi berasaskan memori: semua data disimpan dalam ingatan, jadi semua operasi adalah peringkat memori
  • Struktur data ringkas: Struktur data Redis direka khas, dan ini Kebanyakan mudah daripada kerumitan carian struktur data dan masa operasi ialah o(1)
  • pemultipleksan dan penyekatan IO: gunakan fungsi pemultipleksan IO untuk memantau sambungan soket berbilang kepada pelanggan, supaya Gunakan satu sambungan benang untuk memproses berbilang permintaan, kurangkan overhed yang disebabkan oleh penukaran benang, dan elakkan operasi menyekat IO
  • Elakkan penukaran konteks: Oleh kerana model ini adalah model satu benang, anda boleh mengelakkan penukaran konteks yang tidak perlu dan persaingan berbilang Benang boleh menjimatkan masa dan penggunaan prestasi yang disebabkan oleh penukaran berbilang benang, dan utas tunggal tidak akan menyebabkan masalah kebuntuan

2.3 Gunakan utas tunggal Sebabnya

Redis adalah berdasarkan operasi ingatan, jadi kesesakannya mungkin 机器的内存或者网络带宽而并非 CPU Memandangkan CPU bukan kesesakan, adalah wajar untuk menggunakan penyelesaian berbenang tunggal dan menggunakan berbilang benang Lebih menyusahkan. Tetapi sokongan 多线程了,例如后台删除等功能 bermula dalam Redis 4.0.
Ringkasnya, terdapat tiga sebab utama mengapa single-threading telah digunakan sebelum Redis 4.0:

  • Menggunakan model single-threading menjadikan pembangunan dan penyelenggaraan Redis lebih mudah , kerana single-threading Model memudahkan pembangunan dan penyahpepijatan walaupun model multi-threading berfungsi dengan baik dalam beberapa aspek, ia memperkenalkan ketidakpastian dalam susunan pelaksanaan program, membawa beberapa masalah dengan membaca dan menulis serentak, meningkatkan kerumitan sistem, dan boleh menyebabkan kehilangan prestasi yang disebabkan oleh penukaran benang, malah mengunci dan membuka kunci, dan kebuntuan. Redis mempunyai prestasi pemprosesan yang sangat tinggi melalui model acara AE dan pemultipleksan IO dan teknologi lain, jadi tidak perlu menggunakan multi-threading. Mekanisme satu-utas sangat mengurangkan kerumitan pelaksanaan dalaman Redis, Rehash, Lpush dan perintah "benang-tidak selamat" yang lain boleh dilaksanakan tanpa kunci.

  • Walaupun menggunakan model satu benang, berbilang permintaan pelanggan boleh diproses secara serentak, terutamanya menggunakan pemultipleksan dan IO tidak menyekat

  • Untuk sistem Redis, 性能瓶颈是内存或者网络带宽而并非 CPU utama.

3. Model berbilang benang Redis

3.1 Sebab memperkenalkan multi-benang

既然单线程那么好,为啥又要引入多线程?Urutan tunggal juga mempunyai masalahnya sendiri, seperti masalah pemadaman kunci besar: Dalam keadaan biasa, arahan del boleh digunakan untuk memadam data dengan cepat Walau bagaimanapun, apabila kunci yang dipadam adalah objek yang sangat besar, seperti set cincang yang mengandungi beribu-ribu elemen, arahan del akan menyebabkan induk Redis gagal tersekat.

Oleh itu, modul berbilang benang telah ditambah dalam Redis 4.0 Sudah tentu, berbilang benang dalam versi ini adalah untuk menyelesaikan masalah kecekapan pemadaman data yang rendah. Anda boleh mengelakkan masalah lag Redis (pemadaman kunci besar, dll.) dengan berkesan melalui pemadaman malas Langkah-langkahnya adalah seperti berikut:

  • unlink key: pemadaman kunci. fungsi adalah sama dengan DEL Satu-satunya perbezaan dalam pelaksanaan bebas malas ialah apabila UNLINK memadamkan kunci jenis set, jika bilangan elemen dalam kunci set lebih daripada 64, utas utama hanya mengeluarkan kunci yang akan dipadamkan daripada kamus pangkalan data, dan operasi pelepasan memori sebenar dijalankan dengan bio yang berasingan. Jika bilangan elemen adalah kecil (kurang daripada 64) atau jenis String, ia juga akan dipadamkan terus dalam utas utama.

  • flushall/flushdb async: Untuk arahan flushall/flushdb mengosongkan pangkalan data, pilihan pembersihan tak segerak async ditambah, supaya redis beroperasi secara tidak segerak apabila mengosongkan pangkalan data. Logik pelaksanaan adalah untuk mencipta kamus kosong baharu untuk pangkalan data, dan memberikan kamus pangkalan data lama yang asal kepada benang latar belakang untuk memadam data satu demi satu dan melepaskan memori.

  • Kerja pemadaman diserahkan kepada sub-proses latar belakang untuk memadam data secara tidak segerak

Oleh kerana Redis diproses oleh satu utas utama, antirez, bapa kepada redis, sentiasa menekankan "Lazy Redis is better Redis". masa menyekat benang. Ini mengurangkan prestasi dan isu kestabilan yang disebabkan oleh pemadaman. lazy free某些cost(主要时间复制度,占用主线程cpu时间片)较高删除操作Redis 4.0 memperkenalkan berbilang utas untuk melaksanakan fungsi seperti pemadaman malas tak segerak bagi data, tetapi ia masih mempunyai satu utas untuk memproses permintaan baca dan tulis, jadi ia masih dianggap sebagai utas tunggal dalam erti kata yang sempit.

Analisis daripada ringkasan sebelumnya: Kesesakan prestasi utama Redis ialah memori atau lebar jalur rangkaian dan bukannya CPU. Masalah ingatan agak mudah untuk diselesaikan, jadi kesesakan Redis ialah rangkaian IO. Seterusnya, model multi-threading diperkenalkan.

3.2 Prinsip kerja multi-threadingI/O membaca dan menulis sendiri disekat Sebagai contoh, apabila terdapat data dalam soket, Redis Data akan disalin dari ruang kernel ke ruang pengguna melalui panggilan, dan kemudian diserahkan kepada Redis untuk panggilan Proses penyalinan ini disekat Apabila jumlah data lebih besar, salinan akan mengambil lebih banyak masa , dan operasi ini adalah Ia dilakukan berdasarkan utas tunggal.

Analisis ringkas model satu benang dan berbilang benang dalam Redis6Baharu dalam Redis 6.0 ialah

fungsi berbilang benang untuk meningkatkan prestasi baca dan tulis I/O

Idea pelaksanaan utamanya adalah untuk menggabungkan tugas baca dan tulis IO utas utama. Pisahkan kepada kumpulan utas bebas untuk pelaksanaan, supaya pembacaan dan penulisan berbilang soket boleh diselaraskan Penggunaan teknologi pemultipleksan I/O berbilang saluran boleh membolehkan satu utas mengendalikan berbilang permintaan sambungan (. meminimumkan penggunaan masa IO rangkaian), bacaan Soket, penghuraian permintaan dan penulisan yang paling memakan masa adalah disumber luar secara berasingan Pelaksanaan perintah yang selebihnya masih dilaksanakan secara bersiri oleh utas utama dan berinteraksi dengan data dalam memori. Seperti yang dapat dilihat daripada rajah di atas, Analisis ringkas model satu benang dan berbilang benang dalam Redis6 membaca dan menulis data rangkaian dan menghuraikan protokol permintaan melalui berbilang benang IO Untuk pelaksanaan arahan sebenar, operasi utas utama masih digunakan (keselamatan benang)
, adalah kompromi yang baik. Oleh itu, . 对于整个Redis来说是多线程的,但是对于工作线程(命令执行)仍旧是单线程3.3 Aliran Kerja

Proses teras adalah kira-kira seperti berikut:

Proses ini diterangkan secara ringkas seperti berikut: Analisis ringkas model satu benang dan berbilang benang dalam Redis6

Utas utama memperoleh soket dan masukkan ke dalam senarai menunggu
  • Tetapkan soket kepada setiap utas IO (bukan tunggu senarai penuh)
  • Utas utama
  • membaca soket dan selesai
  • 阻塞等待 IO 线程(多线程)Benang utama melaksanakan perintah -
  • (jika Perintah itu belum diterima, dan akan menunggu IO untuk diteruskan pada masa akan datang)
  • 单线程Benang utama
  • telah selesai menulis data kembali ke soket (ia belum selesai menulis sekali, dan akan menunggu untuk kali seterusnya)
  • 阻塞等待 IO 线程(多线程)Lepaskan Set, kosongkan baris gilir menunggu
Ciri-ciri adalah seperti berikut:

  • Benang IO sama ada membaca soket pada masa yang sama, atau menulis pada masa yang sama, dan tidak akan membaca atau menulis pada masa yang sama
  • Benang IO hanya bertanggungjawab untuk membaca dan menulis arahan penghuraian soket, dan tidak bertanggungjawab untuk pemprosesan arahan (benang utama melaksanakan perintah bersiri)
  • Bilangan benang IO boleh dikonfigurasikan sendiri (Had kod semasa ialah 512 , dan lalai ialah 1 (matikan fungsi ini)

Selepas pertimbangan yang teliti oleh pihak yang berminat Ujian tekanan, prestasi semasa boleh dipertingkatkan lebih daripada 1 kali.

Soalan 1: Adakah senarai menunggu disekat dan tidak diproses jika tidak penuh?
Balas: Analisis ringkas model satu benang dan berbilang benang dalam Redis6Apa yang dikesan semasa menyekat ialah sama ada urutan IO masih mempunyai tugas. Tunggu sehingga pemprosesan selesai sebelum meneruskan. Tugasan ini ditambah semasa pelaksanaan Jika bilangan tugasan Saya masih mempunyai keraguan tentang ini. Bolehkah sesiapa menjelaskannya (komen)?

3.4 Adakah berbilang benang didayakan secara lalai?

Dalam Redis6.0, 多线程机制默认是关闭的 , jika anda perlu menggunakan fungsi berbilang benang, anda perlu melengkapkan dua tetapan dalam redis.conf. Analisis ringkas model satu benang dan berbilang benang dalam Redis6

  • Tetapkan item konfigurasi io-thread-do-reads kepada ya, yang bermaksud memulakan berbilang urutan.
  • Tetapkan bilangan utas. Mengenai tetapan bilangan utas, syor rasmi ialah jika ia adalah CPU 4 teras, adalah disyorkan bahawa bilangan utas ditetapkan kepada 2 atau 3, 如果为 8 核 CPU 建议线程数设置为 6 Bilangan utas mestilah lebih kecil daripada bilangan teras mesin Lebih banyak bilangan benang, lebih baik.

4 Ringkasan

Redis sendiri sangat baik sejak debutnya, berdasarkan operasi memori, struktur data mudah, pemultipleksan dan I/O tidak menyekat, mengelak Ia menghapuskan penukaran konteks rangkaian yang tidak perlu dan ciri-ciri lain, dan masih sangat pantas dalam persekitaran satu-utas

Tetapi pemadaman kunci data besar masih sangat perlahan, jadi kunci nyahpaut berbilang benang; diperkenalkan dalam Redis 4.0 Perintah seperti async digunakan terutamanya untuk pemadaman tak segerak bagi data Redis;

Dalam Redis 6.0, bacaan dan penulisan berbilang benang I/O diperkenalkan, supaya lebih banyak tugasan boleh diproses dengan lebih cekap. Redis hanya 将 I/O 读写变成了多线程 , dan 命令的执行依旧是由主线程串行执行的 , jadi Redis 不会出现线程安全的问题 dikendalikan di bawah pelbagai benang.

Redis Sama ada reka bentuk benang tunggal asal atau reka bentuk berbilang benang semasa yang bertentangan dengan reka bentuk asal, hanya ada satu tujuan: untuk menjadikan Redis lebih pantas dan pantas.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengenalan kepada Pengaturcaraan! !

Atas ialah kandungan terperinci Analisis ringkas model satu benang dan berbilang benang dalam Redis6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan