Jadual Kandungan
Ikhtisar#
Sebagai contoh, untuk melaksanakan perintah get, fungsi getCommand akan dipanggil:
Cari data dalam fungsi getCommand, dan kemudian panggil addReply untuk menulis data yang dikembalikan ke dalam output klien penampan .
Rumah pangkalan data Redis Apakah proses pemprosesan permintaan Redis?

Apakah proses pemprosesan permintaan Redis?

Jun 01, 2023 pm 08:49 PM
redis

Ikhtisar#

  • Yang pertama ialah mendaftarkan pemproses; sambungan didengari ;

  • Kemudian Goroutine akan menunggu dalam gelung untuk menerima data permintaan, dan kemudian memadankan pemproses yang sepadan dalam jadual penghalaan pemproses mengikut alamat yang diminta, dan kemudian serahkan permintaan kepada pemproses untuk diproses ;

  • yang dinyatakan dalam kod adalah seperti ini:

    func (srv *Server) Serve(l net.Listener) error { 
        ...
        baseCtx := context.Background()  
        ctx := context.WithValue(baseCtx, ServerContextKey, srv)
        for {
            // 接收 listener 过来的网络连接
            rw, err := l.Accept()
            ... 
            tempDelay = 0
            c := srv.newConn(rw)
            c.setState(c.rwc, StateNew) 
            // 创建协程处理连接
            go c.serve(connCtx)
        }
    }
    Salin selepas log masuk
  • Ia sedikit berbeza untuk Redis, kerana ia adalah satu benang dan tidak boleh menggunakan berbilang benang untuk mengendalikan sambungan Oleh itu, Redis memilih untuk menggunakan pemacu peristiwa berdasarkan corak Reaktor untuk melaksanakan pemprosesan peristiwa serentak.

Apa yang dipanggil mod Reaktor dalam Redis adalah untuk memantau berbilang fd melalui epoll Setiap kali fd ini bertindak balas, epoll akan dimaklumkan dalam bentuk acara untuk panggilan balik Setiap acara mempunyai pengendali acara yang sepadan.

Apakah proses pemprosesan permintaan Redis?Contohnya: terima sepadan dengan pengendali acara acceptTCPHandler, baca & tulis sepadan dengan pengendali acara readQueryFromClient, dsb., dan kemudian acara itu diperuntukkan kepada pengendali acara untuk diproses melalui penghantaran gelung acara.

Jadi mod Reaktor di atas dilaksanakan melalui epoll Untuk epoll, terdapat tiga kaedah:

//创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大
int epoll_create(int size);

/*
 * 可以理解为,增删改 fd 需要监听的事件
 * epfd 是 epoll_create() 创建的句柄。
 * op 表示 增删改
 * epoll_event 表示需要监听的事件,Redis 只用到了可读,可写,错误,挂断 四个状态
 */
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

/*
 * 可以理解为查询符合条件的事件
 * epfd 是 epoll_create() 创建的句柄。
 * epoll_event 用来存放从内核得到事件的集合
 * maxevents 获取的最大事件数
 * timeout 等待超时时间
 */
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
Salin selepas log masuk

Jadi kita boleh melaksanakan kaedah mudah berdasarkan tiga kaedah Pelayan:

// 创建监听
int listenfd = ::socket();

// 绑定ip和端口
int r = ::bind();  
// 创建 epoll 实例
int epollfd = epoll_create(xxx); 
// 添加epoll要监听的事件类型
int r = epoll_ctl(..., listenfd, ...);
 
struct epoll_event* alive_events =  static_cast<epoll_event*>(calloc(kMaxEvents, sizeof(epoll_event)));

while (true) {
    // 等待事件
    int num = epoll_wait(epollfd, alive_events, kMaxEvents, kEpollWaitTime);
	// 遍历事件,并进行事件处理
    for (int i = 0; i < num; ++i) {
        int fd = alive_events[i].data.fd;
        // 获取事件
        int events = alive_events[i].events;
		// 进行事件的分发
        if ( (events & EPOLLERR) || (events & EPOLLHUP) ) {
            ...
        } else  if (events & EPOLLRDHUP) {
            ...
        } 
        ...
    }   
}
Salin selepas log masuk
.

Proses panggilan #

Jadi mengikut pengenalan di atas, anda boleh tahu bahawa untuk Redis, gelung acara tidak lebih daripada beberapa langkah:

Daftar fungsi mendengar acara dan panggilan balik;

  • Gelung untuk menunggu acara diperoleh dan diproses;

  • Tulis data kembali kepada Pelanggan

  • Daftar fd ke epoll , Dan tetapkan fungsi panggil balik acceptTcpHandler Jika terdapat sambungan baharu, fungsi panggil balik akan dipanggil; Kemudian kami akan kembali ke fungsi aeMain untuk menggelungkan fungsi aeProcessEvents

Apakah proses pemprosesan permintaan Redis?Apabila acara rangkaian datang, fungsi panggil balik acceptTcpHandler akan dipanggil sepenuhnya untuk readQueryFromClient untuk pemprosesan data akan menghuraikan data pelanggan dan mencari fungsi cmd yang sepadan. bukannya kembali serta-merta;

Keseluruhan acara di atas Sebenarnya, langkah kod proses gelung telah ditulis dengan sangat jelas, dan terdapat banyak artikel di Internet mengenainya, jadi saya tidak akan menerangkan secara terperinci.
  • Proses pelaksanaan perintah & klien tulis balik#

    Pelaksanaan perintah#
  • Mari kita bercakap tentang sesuatu yang banyak artikel di Internet tidak disebut dan lihat cara Redis melaksanakan arahan . , kemudian simpannya dalam cache, dan tulis semula data kepada klien daripada cache.

  • Kami juga menyebut dalam bahagian sebelumnya bahawa jika acara rangkaian datang, fungsi readQueryFromClient akan dipanggil, di mana arahan itu sebenarnya dilaksanakan. Kami hanya mengikut kaedah ini dan melihat ke bawah:

  • readQueryFromClient akan memanggil fungsi processInputBufferAndReplicate untuk memproses arahan yang diminta

  • dalam fungsi processInputBufferAndReplicate It; akan memanggil processInputBuffer dan menentukan sama ada arahan itu perlu disalin ke nod lain jika ia adalah mod kluster

fungsi processInputBuffer akan menggelung melalui arahan yang diminta dan memanggilnya mengikut protokol yang diminta processInlineBuffer; fungsi, selepas memanggil objek redisObject, processCommand dipanggil untuk melaksanakan perintah itu; arahan, dan kemudian pergi melalui siri pengesahan, panggil fungsi yang sepadan untuk melaksanakan arahan, dan panggil addReply untuk menulis data yang dikembalikan ke dalam penimbal output klien; 🎜> akan menambah semua data dalam fungsi populateCommandTable Arahan Redis didaftarkan sebagai jadual yang memperoleh fungsi arahan berdasarkan nama arahan.

Sebagai contoh, untuk melaksanakan perintah get, fungsi getCommand akan dipanggil:

void getCommand(client *c) {
    getGenericCommand(c);
}

int getGenericCommand(client *c) {
    robj *o;
	// 查找数据
    if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL)
        return C_OK;
    ...
}

robj *lookupKeyReadOrReply(client *c, robj *key, robj *reply) {
    //到db中查找数据
    robj *o = lookupKeyRead(c->db, key);
    // 写入到缓存中
    if (!o) addReply(c,reply);
    return o;
}
Salin selepas log masuk

Cari data dalam fungsi getCommand, dan kemudian panggil addReply untuk menulis data yang dikembalikan ke dalam output klien penampan .

Klien tulis balik data #

Selepas menulis arahan ke dalam penimbal, data perlu dikeluarkan daripada penimbal dan dikembalikan kepada klien. Untuk proses menulis data kembali kepada klien, ia sebenarnya telah selesai dalam gelung acara pelayan. Apakah proses pemprosesan permintaan Redis?

Apakah proses pemprosesan permintaan Redis?

  • Pertama, Redis akan memanggil fungsi aeSetBeforeSleepProc dalam fungsi utama untuk mendaftarkan fungsi beforeSleep bagi pakej tulis balik ke dalam eventLoop; >

    Kemudian apabila Redis memanggil fungsi aeMain untuk gelung acara, ia akan menentukan sama ada beforesleep telah ditetapkan. Pergi ke fungsi handleClientsWithPendingWrites, yang memanggil writeToClient untuk menulis kembali data kepada klien daripada penimbal.

Atas ialah kandungan terperinci Apakah proses pemprosesan permintaan Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara Membina Mod Kluster Redis Cara Membina Mod Kluster Redis Apr 10, 2025 pm 10:15 PM

Mod Redis cluster menyebarkan contoh Redis ke pelbagai pelayan melalui sharding, meningkatkan skalabilitas dan ketersediaan. Langkah -langkah pembinaan adalah seperti berikut: Buat contoh Redis ganjil dengan pelabuhan yang berbeza; Buat 3 contoh sentinel, memantau contoh redis dan failover; Konfigurasi fail konfigurasi sentinel, tambahkan pemantauan maklumat contoh dan tetapan failover; Konfigurasi fail konfigurasi contoh Redis, aktifkan mod kluster dan tentukan laluan fail maklumat kluster; Buat fail nodes.conf, yang mengandungi maklumat setiap contoh Redis; Mulakan kluster, laksanakan perintah Buat untuk membuat kluster dan tentukan bilangan replika; Log masuk ke kluster untuk melaksanakan perintah maklumat kluster untuk mengesahkan status kluster; buat

Cara membersihkan data redis Cara membersihkan data redis Apr 10, 2025 pm 10:06 PM

Cara Mengosongkan Data Redis: Gunakan perintah Flushall untuk membersihkan semua nilai utama. Gunakan perintah flushdb untuk membersihkan nilai utama pangkalan data yang dipilih sekarang. Gunakan Pilih untuk menukar pangkalan data, dan kemudian gunakan FlushDB untuk membersihkan pelbagai pangkalan data. Gunakan perintah DEL untuk memadam kunci tertentu. Gunakan alat REDIS-CLI untuk membersihkan data.

Cara Membaca Gilir Redis Cara Membaca Gilir Redis Apr 10, 2025 pm 10:12 PM

Untuk membaca giliran dari Redis, anda perlu mendapatkan nama giliran, membaca unsur -unsur menggunakan arahan LPOP, dan memproses barisan kosong. Langkah-langkah khusus adalah seperti berikut: Dapatkan nama giliran: Namakannya dengan awalan "giliran:" seperti "giliran: my-queue". Gunakan arahan LPOP: Keluarkan elemen dari kepala barisan dan kembalikan nilainya, seperti LPOP Queue: My-Queue. Memproses Baris kosong: Jika barisan kosong, LPOP mengembalikan nihil, dan anda boleh menyemak sama ada barisan wujud sebelum membaca elemen.

Cara menggunakan perintah redis Cara menggunakan perintah redis Apr 10, 2025 pm 08:45 PM

Menggunakan Arahan Redis memerlukan langkah -langkah berikut: Buka klien Redis. Masukkan arahan (nilai kunci kata kerja). Menyediakan parameter yang diperlukan (berbeza dari arahan ke arahan). Tekan Enter untuk melaksanakan arahan. Redis mengembalikan tindak balas yang menunjukkan hasil operasi (biasanya OK atau -r).

Cara menggunakan kunci redis Cara menggunakan kunci redis Apr 10, 2025 pm 08:39 PM

Menggunakan REDIS untuk mengunci operasi memerlukan mendapatkan kunci melalui arahan SETNX, dan kemudian menggunakan perintah luput untuk menetapkan masa tamat tempoh. Langkah-langkah khusus adalah: (1) Gunakan arahan SETNX untuk cuba menetapkan pasangan nilai utama; (2) Gunakan perintah luput untuk menetapkan masa tamat tempoh untuk kunci; (3) Gunakan perintah DEL untuk memadam kunci apabila kunci tidak lagi diperlukan.

Cara membaca kod sumber redis Cara membaca kod sumber redis Apr 10, 2025 pm 08:27 PM

Cara terbaik untuk memahami kod sumber REDIS adalah dengan langkah demi langkah: Dapatkan akrab dengan asas -asas Redis. Pilih modul atau fungsi tertentu sebagai titik permulaan. Mulakan dengan titik masuk modul atau fungsi dan lihat baris kod mengikut baris. Lihat kod melalui rantaian panggilan fungsi. Berhati -hati dengan struktur data asas yang digunakan oleh REDIS. Kenal pasti algoritma yang digunakan oleh Redis.

Cara menyelesaikan kehilangan data dengan redis Cara menyelesaikan kehilangan data dengan redis Apr 10, 2025 pm 08:24 PM

Kerugian data REDIS termasuk kegagalan memori, gangguan kuasa, kesilapan manusia, dan kegagalan perkakasan. Penyelesaiannya adalah: 1. 2. Salin ke beberapa pelayan untuk ketersediaan tinggi; 3. Ha dengan redis sentinel atau cluster redis; 4. Buat gambar untuk membuat sandaran data; 5. Melaksanakan amalan terbaik seperti kegigihan, replikasi, gambar, pemantauan, dan langkah -langkah keselamatan.

Cara menggunakan baris arahan redis Cara menggunakan baris arahan redis Apr 10, 2025 pm 10:18 PM

Gunakan alat baris perintah redis (redis-cli) untuk mengurus dan mengendalikan redis melalui langkah-langkah berikut: Sambungkan ke pelayan, tentukan alamat dan port. Hantar arahan ke pelayan menggunakan nama arahan dan parameter. Gunakan arahan bantuan untuk melihat maklumat bantuan untuk arahan tertentu. Gunakan perintah berhenti untuk keluar dari alat baris arahan.

See all articles