Rumah > Artikel > pangkalan data > Analisis ringkas model satu benang dan berbilang benang dalam Redis6
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!
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]
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.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.
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 性能很快的主要原因
:
o(1)
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.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.
Baharu 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, 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 ini diterangkan secara ringkas seperti berikut:
阻塞等待 IO 线程(多线程)
Benang utama melaksanakan perintah - 单线程
Benang utama 阻塞等待 IO 线程(多线程)
Lepaskan Set, kosongkan baris gilir menunggu 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: Apa 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.
如果为 8 核 CPU 建议线程数设置为 6
Bilangan utas mestilah lebih kecil daripada bilangan teras mesin Lebih banyak bilangan benang, lebih baik. 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!