Artikel ini membawa anda pengetahuan yang berkaitan tentang Redis, yang terutamanya memperkenalkan isu yang berkaitan dengan peristiwa fail dan peristiwa masa ialah pengabstrakan operasi soket oleh pelayan, dan peristiwa masa Ia adalah pengabstrakan operasi pemasaan seperti ini oleh pelayan saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: Tutorial Redis
Redis adalah benang tunggal sebelum 6.0 Selepas 6.0, anda boleh mendayakan berbilang rangkaian melalui fail konfigurasi. Benang, berbilang benang selepas 6.0 merujuk kepada penggunaan berbilang benang untuk pelaksanaan dalam io untuk mempercepatkan I/O.
Pemproses acara fail terdiri daripada empat bahagian: soket, Multiplexer I/O, penghantar acara fail , pengendali acara.
Pemultipleks I/O bertanggungjawab untuk mendengar berbilang soket dan menghantar soket tersebut yang menjana peristiwa kepada penghantar acara fail. Walaupun berbilang peristiwa fail mungkin berlaku serentak, pemultipleks I/O tunggal akan sentiasa meletakkan semua soket peristiwa yang dijana ke dalam baris gilir, dan kemudian melalui baris gilir ini secara teratur dan segerak Soket penghantaran dihantar ke satu soket acara fail suatu masa. Apabila peristiwa yang dijana oleh soket sebelumnya diproses (pemprosesan peristiwa yang dikaitkan dengan soket selesai), pemultipleks I/O akan terus menghantar soket seterusnya kepada penghantar peristiwa fail Penghantar peristiwa fail menerima soket daripada I /O pemultipleks dan menggunakan pengendali peristiwa yang sepadan mengikut jenis peristiwa yang dihasilkan oleh soket Pelayan akan melaksanakan perkaitan soket yang berbeza untuk pengendali acara yang berbeza, pengendali ini menentukan tindakan yang harus dilakukan oleh pelayan apabila sesuatu peristiwa berlaku.
Semua fungsi program pemultipleksan Redis dibungkus oleh pemultipleksan I/O pilih, epoll, evport dan kqueue
Acara AE_READABLE
Apabila soket menjadi boleh dibaca (pelanggan melakukan operasi tulis atau tutup ) atau apabila soket baharu yang boleh bertindak balas muncul, soket akan menjana acara AE_READABLE.
Acara AE_WAITABLE
Apabila soket boleh ditulis (pelanggan melakukan operasi baca), acara AE_WAITABLE akan dijana
Pemultipleks I/O akan serentak Mendengar Acara AE_READABLE dan acara AE_WAITABLE Jika soket menjana kedua-dua acara pada masa yang sama, penghantar acara akan mengutamakan acara AE_READABLE, yang bermaksud bahawa pelayan akan membaca soket terlebih dahulu dan kemudian menulis soket.
Mula-mula, klien Redis memulakan sambungan ke pelayan, kemudian soket mendengar akan menjana acara AE_READABEL, mencetuskan pemprosesan tindak balas sambungan Apabila pemproses dilaksanakan, pemproses akan bertindak balas kepada permintaan sambungan klien, kemudian mencipta soket klien dan status klien, dan mengaitkan peristiwa AE_REAADABEL soket klien dengan pemproses permintaan arahan supaya klien boleh The master pelayan menghantar permintaan arahan.
Dengan mengandaikan bahawa klien menghantar permintaan arahan ke pelayan utama, soket klien akan menjana peristiwa AE_READABEL, mencetuskan pemproses permintaan arahan untuk melaksanakan pemproses membaca arahan klien dan kemudian menghantarnya kepada program yang berkaitan untuk melaksanakan.
Melaksanakan arahan akan menghasilkan balasan arahan yang sepadan Untuk menghantar baris balasan arahan ini kembali kepada klien, pelayan akan mengaitkan acara AE_WAITABLE dengan pemproses balasan arahan. Apabila pelanggan cuba membaca balasan arahan, pelanggan akan menjana acara AE_WAITABLE, mencetuskan pelaksanaan pemproses balasan arahan Apabila pemproses balasan arahan menulis balasan arahan ke soket dalam keseluruhan pelayan, pelayan akan melepaskan klien soket. Acara AE_WAITABLE dikaitkan dengan pelaksanaan pengendali balasan arahan.
Sama ada acara masa ialah acara bermasa atau acara berkala bergantung pada nilai pulangan pemproses acara masa Jika pemproses acara mengembalikan ae.h/AE_NOMORE, maka acara itu adalah acara bermasa . Acara adalah Selepas tiba sekali, ia akan dipadamkan dan tidak akan dicapai lagi. Jika pengendali peristiwa mengembalikan nilai integer selain daripada AE_NOMORE, maka peristiwa itu adalah peristiwa berkala Apabila peristiwa masa dicapai, pelayan akan mengemas kini atribut bila peristiwa berdasarkan nilai pulangan pengendali peristiwa, supaya peristiwa itu. acara akan berterusan untuk tempoh masa Ia tiba semula selepas tempoh masa tertentu dan dikemas kini dan dijalankan dengan cara ini.
Pelayan meletakkan semua peristiwa masa dalam senarai terpaut tidak tertib (Yang tidak tertib tidak merujuk kepada medan id, tetapi medan bila, jadi ia mesti dilalui setiap kali ia dilaksanakan Lengkapkan senarai terpaut ), bila-bila masa pelaksana acara berjalan, ia akan melintasi keseluruhan senarai terpaut, mencari semua acara yang telah tiba dan memanggil pengendali acara yang sepadan.
Apa yang perlu diterangkan di sini ialah walaupun ia adalah senarai terpaut yang tidak tersusun, panjang senarai terpaut tidak terlalu panjang dalam mod biasa, pelayan Redis hanya menggunakan serverCron sebagai peristiwa masa, jadi tempat ini akan merosot ke dalam peranan penunjuk Dalam mod penanda aras, pelayan Hanya dua peristiwa masa digunakan, jadi kesan traversal penuh pada prestasi boleh diabaikan.
Pelayan Redis yang sedang berjalan perlu kerap menyemak dan melaraskan sumber dan statusnya sendiri untuk memastikan bahawa pelayan boleh berjalan dalam jangka panjang dan stabil ini dilakukan oleh redis .c/ Fungsi serverCron bertanggungjawab untuk melaksanakan tugas utamanya termasuk:
Oleh kerana terdapat kedua-dua peristiwa fail dan peristiwa masa dalam pelayan, pelayan mesti menjadualkan kedua-dua acara ini dan memutuskan bila ia perlu Memproses acara fail, bilakah sepatutnya peristiwa masa diproses, berapa banyak masa yang perlu dibelanjakan untuk memprosesnya, dsb.
Pseudokod proses pemprosesan adalah seperti berikut:
def aeProcessEvents(): # 获取到达时间离当前最近的时间事件 tem_event = aeSearchNearestTimer() # 计算上一步获得到的事件 距离到达还有多少秒 remaind_ms = time_event.when - unix_ts_now() # 如果事件已经到达, 那么remaind_ms的值可能为负数,设置为0 remaind_ms = max(remaind_ms, 0) # 阻塞并等待文件事件产生,最大阻塞时间由timeval结构决定, # 如果remaind_ms的值为0,那么aeAPiPoll调用之后马上返回,不阻塞 aeApiPoll(timeval) # 处理所有已经产生的文件事件 processFileEvents() # 处理所有已经到达的时间事件 proccessTimeEvents()
Penjadualan acara dan peraturan pelaksanaan:
1) Masa sekatan maksimum fungsi aeApiPoll ditentukan oleh peristiwa masa yang masa ketibaannya paling hampir dengan masa semasa Ini Kaedah ini bukan sahaja boleh menghalang pelayan daripada kerap mengundi acara masa (sibuk menunggu), tetapi juga memastikan bahawa fungsi aeApiPoll tidak akan menyekat terlalu lama.
2) Oleh kerana acara fail muncul secara rawak, jika tiada acara masa tiba selepas menunggu dan memproses acara fail, pelayan akan menunggu dan memproses acara fail itu semula. Apabila acara fail terus dilaksanakan, masa akan beransur-ansur menghampiri masa ketibaan yang ditetapkan oleh peristiwa masa, dan akhirnya mencapai masa ketibaan Pada masa ini, pelayan boleh mula memproses acara masa ketibaan.
3) Pemprosesan peristiwa fail dan peristiwa masa dilaksanakan secara serentak, teratur dan secara atom Pelayan tidak akan mengganggu pemprosesan acara di tengah jalan, dan ia tidak akan mendahului peristiwa pemproses atau pemproses acara masa akan mengurangkan masa menyekat program sebanyak mungkin dan secara aktif melepaskan hak pelaksanaan apabila perlu, dengan itu mengurangkan kemungkinan kebuluran acara. Sebagai contoh, apabila pemproses balasan arahan menulis balasan arahan kepada soket klien, jika bilangan bait bertulis melebihi pemalar pratetap, pemproses balasan arahan akan menggunakan pemecahan secara aktif untuk keluar dari gelung penulisan ditulis kali seterusnya; sebagai tambahan, peristiwa masa juga akan meletakkan operasi kegigihan yang memakan masa ke dalam sub-benang atau sub-proses untuk pelaksanaan.
4) Oleh kerana peristiwa masa dilaksanakan selepas peristiwa fail, dan tiada preemption antara peristiwa, masa pemprosesan sebenar peristiwa masa biasanya lewat sedikit daripada masa ketibaan yang ditetapkan oleh peristiwa masa.
Terdapat hubungan kerjasama antara acara fail dan peristiwa masa Pelayan akan mengendalikan kedua-dua acara ini secara bergilir-gilir, dan tidak akan ada preemption semasa pemprosesan acara. Masa pemprosesan sebenar peristiwa masa biasanya lewat daripada masa ketibaan yang ditetapkan.
Pembelajaran yang disyorkan: Tutorial pembelajaran Redis
Atas ialah kandungan terperinci Mari bercakap tentang acara fail redis dan peristiwa masa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!