Rumah  >  Artikel  >  pangkalan data  >  Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis

Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis

青灯夜游
青灯夜游ke hadapan
2021-12-21 10:19:322438semak imbas

Redis adalah satu benang, tetapi mengapa ia begitu pantas? Satu sebab ialah redis menggunakan IO dan pemultipleksan yang tidak menyekat untuk mengendalikan sejumlah besar sambungan pelanggan. Artikel berikut akan membawa anda memahami model IO benang dalam Redis. Saya harap ia akan membantu anda!

Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis

Redis ialah aplikasi satu utas dan Nginx kedua-duanya adalah model pelayan berprestasi tinggi. [Cadangan berkaitan: Tutorial video Redis]

Sebab mengapa Redis berbenang tunggal dan begitu pantas:

Satunya adalah kerana semua datanya berada dalam ingatan Semua operasi adalah operasi peringkat memori, jadi apabila menggunakan redis, perhatikan arahan dengan kerumitan masa O(n) Kerana ia berbenang tunggal, jika jumlah data terlalu besar, arahan lain akan disekat dan menunggu; >

Sebab kedua ialah redis menggunakan IO yang tidak menyekat dan pemultipleksan untuk mengendalikan sejumlah besar sambungan pelanggan.

IO tidak menyekat

Apabila kita menggunakan kaedah baca dan tulis soket, ia menyekat secara lalai

Iaitu, memanggil kaedah baca dan lulus a parameter n, menunjukkan bilangan maksimum bacaan Kembali selepas mengambil n bait Jika tidak ada satu bait, benang akan terus menunggu dalam kaedah baca sehingga data masuk atau sambungan ditutup pada masa ini dan benang boleh melaksanakan logik berikut,

Kaedah tulis secara amnya tidak menyekat Melainkan penimbal tulis yang diperuntukkan oleh kernel untuk soket penuh, kaedah tulis akan menyekat sehingga terdapat ruang kosong dalam penimbal. .

Rajah berikut menunjukkan proses terperinci membaca dan menulis soket.

Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis

IO yang tidak menyekat menyediakan pilihan Non_Blocking apabila menggunakan soket Apabila pilihan ini dihidupkan, kaedah baca dan tulis tidak akan menyekat, tetapi akan membaca sama banyaknya boleh. , anda boleh menulis seberapa banyak yang anda mahukan

Berapa banyak yang anda boleh baca bergantung pada bilangan bait data dalam penimbal baca yang diperuntukkan oleh kernel untuk soket data yang diperuntukkan oleh kernel dalam penimbal tulis soket Bilangan bait,

kaedah membaca dan menulis akan memberitahu program berapa banyak bait telah dibaca dan ditulis melalui nilai pulangan.

IO yang tidak menyekat bermakna benang tidak lagi perlu disekat apabila membaca dan menulis boleh disiapkan serta-merta, dan benang boleh terus melakukan perkara lain.

Multiplexing (tinjauan acara)

Walaupun IO tidak menyekat adalah pantas, ia juga membawa masalah membaca data dan kembali selepas membaca sebahagian daripadanya. Bilakah data yang tinggal akan terus dibaca? , menulis data, penimbal penuh dan belum ditulis sepenuhnya Bilakah data yang tinggal akan terus ditulis?

Apabila anda boleh terus membaca atau terus menulis, anda harus memberi aplikasi pemberitahuan untuk memberitahu aplikasi bahawa anda boleh terus membaca atau terus menulis API pengundian acara digunakan untuk menangani masalah ini.

pilih

Sistem pengendalian menyediakan fungsi pilih kepada program pengguna Input ialah senarai deskriptor baca dan tulis read_fds & write_fds, dan outputnya adalah Untuk peristiwa yang boleh dibaca dan boleh ditulis yang sepadan,

juga menyediakan parameter tamat masa paling lama utas akan meneruskan pemprosesan. Jika masa tamat masa melebihi, Kaedah juga akan kembali

Jika acara diperoleh, utas boleh memproses acara yang sepadan satu demi satu, ia akan terus memanggil pilih undian api, jadi benang sebenarnya adalah gelung tak terhingga dan terus memilih pemprosesan tanpa henti, berulang-alik, gelung tanpa henti ini dipanggil gelung peristiwa dan gelung ialah kitaran.

Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis

Pseudokod gelung peristiwa:

while True
    read_events, write_events = select(read_fds, write_fds, timeout)
    for event in read_events:
        handle_read(event.fd)
    for event in write_events:
        handle_write(event.fd)
    handle_others() # 做其他的逻辑处理,处理定时任务等等
Melalui fungsi pilih kita boleh mengendalikan acara baca dan tulis bagi berbilang saluran deskriptor, jadi pilih jenis ini panggilan fungsi sistem dipanggil API pemultipleksan

API pemultipleksan sistem pengendalian moden tidak lagi menggunakan panggilan sistem terpilih, tetapi sebaliknya menggunakan epoll (linux) dan kqueue (FreeBSD, macosx). Prestasi pilih akan menjadi sangat lemah apabila bilangan deskriptor meningkat Penggunaan epoll dan pilih sedikit berbeza, tetapi ia boleh difahami menggunakan pseudokod di atas Apabila peristiwa berlaku dalam deskriptor, huraian digelungkan simbol diproses. Operasi baca

objek soket pelayan merujuk kepada panggilan terima untuk menerima sambungan baharu daripada pelanggan Apabila sambungan datang, ia juga dimaklumkan melalui acara baca yang dipanggil oleh pilih.

Teknologi NIO di Java ialah pengundian acara, dan bahasa lain juga mempunyai teknologi ini.

Baris Gilir Perintah

Redis mengaitkan baris gilir arahan dengan setiap soket klien, dan arahan yang dihantar oleh klien diproses dalam susunan masuk dahulu, keluar dahulu melalui baris gilir.

Barisan Balas

Begitu juga, keputusan yang dikembalikan oleh Redis juga dikembalikan melalui baris gilir yang dikaitkan dengan setiap pelanggan Jika baris gilir kosong, tidak perlu mendapatkan acara tulis buat masa ini ,

Pada masa ini, deskriptor klien akan dialih keluar daripada write_fds, dan apabila terdapat data dalam baris gilir, deskriptor akan dimasukkan. Ini boleh mengelakkan mendapati tiada data untuk ditulis apabila memilih panggilan sistem mengembalikan acara tulis, menyebabkan situasi kosong, pengundian tidak berguna, penggunaan CPU mesin.

Tugas berjadual

Pelayan bukan sahaja perlu bertindak balas kepada acara IO, tetapi juga perlu mengendalikan beberapa perkara lain, seperti tugasan berjadual aplikasi itu sendiri Jika urutan menyekat pada panggilan pilih, menunggu pengembalian pilih, ini akan menyebabkan Beberapa tugas berjadual telah tamat tempoh tetapi belum dilaksanakan

Tugas berjadual Redis direkodkan dalam struktur data yang dipanggil timbunan minimum Dalam timbunan ini, tugas terpantas untuk dilaksanakan berada di kedudukan teratas Setiap kitaran Semasa kitaran, redis akan memproses tugasan dalam timbunan yang telah mencapai titik masa Selepas

diproses, ia akan merekodkan masa yang diperlukan untuk tugasan dilaksanakan dalam. timbunan. Apabila pilih dipanggil semula, kali ini akan menjadi Nilai tamat masa bermakna tiada tugas lain yang perlu dilaksanakan dalam tempoh ini dengan yakin bahawa ia akan menyekat paling lama ini, dan kemudian melakukan pemprosesan yang sepadan selepas masa tamat.

Prinsip pemprosesan acara NodeJs dan Nginx adalah serupa dengan Redis.

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

Atas ialah kandungan terperinci Artikel ini akan membawa anda memahami dengan cepat model IO benang dalam Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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