Ada banyak informasi dalam dokumentasi Redis untuk memahami cara kerjanya. Sekarang, untuk menjawab pertanyaan Anda secara spesifik:
1) Bagaimana koneksi dipelihara?
Koneksi dipelihara dan dikelola menggunakan ae event loop (dirancang oleh penulis Redis). Semua operasi I/O jaringan tidak memblokir. Anda dapat melihat ae sebagai implementasi minimalis menggunakan mekanisme demultiplexing jaringan I/O terbaik dari platform (epoll untuk Linux, kqueue untuk BSD, dll ...) seperti libevent, libev, libuv, dll ...
2) Apakah koneksi TCP atau HTTP?
Koneksi adalah TCP menggunakan protokol Redis, yang merupakan protokol sederhana yang kompatibel dengan telnet, berorientasi teks yang mendukung data biner. Protokol ini biasanya lebih efisien daripada HTTP.
3) Bagaimana memori dikelola?
Memori dikelola dengan mengandalkan pengalokasi memori tujuan umum. Pada beberapa platform, ini sebenarnya adalah pengalokasi memori sistem. Pada beberapa platform lain (termasuk Linux), jemalloc telah dipilih karena menawarkan keseimbangan yang baik antara konsumsi CPU, dukungan konkurensi, fragmentasi, dan jejak memori. kode sumber jemalloc adalah bagian dari distribusi Redis.
Bertentangan dengan produk lain (seperti memcached), tidak ada implementasi pengalokasi slab di Redis.
Sejumlah struktur data yang dioptimalkan telah diterapkan di atas pengalokasi tujuan umum untuk mengurangi jejak memori.
4) Apa saja teknik sinkronisasi yang digunakan untuk mencapai throughput tinggi meskipun ada persaingan baca/tulis?
Redis adalah loop peristiwa berulir tunggal, jadi tidak ada sinkronisasi yang harus dilakukan karena semua perintah adalah serial. Sekarang, beberapa utas juga berjalan di latar belakang untuk keperluan internal. Dalam kasus yang jarang terjadi, mereka mengakses data yang dikelola oleh utas utama, primitif sinkronisasi pthread klasik digunakan (misalnya, mutex). Namun 100% akses data yang dilakukan atas nama beberapa koneksi klien tidak memerlukan sinkronisasi apa pun.
Anda dapat menemukan informasi lebih lanjut di sana:Redis adalah single-threaded, lalu bagaimana cara melakukan I/O bersamaan?
Apa perbedaan antara implementasi vanilla biasa dari mesin dengan cache memori dan server yang dapat merespons perintah dan kotak Redis?
Tidak ada perbedaan. Redis adalah implementasi vanilla sederhana dari mesin dengan cache memori dan server yang dapat merespons perintah. Tapi ini adalah implementasi yang dilakukan dengan benar:
- menggunakan model loop peristiwa berulir tunggal
- menggunakan struktur data sederhana dan minimalis yang dioptimalkan untuk kasus penggunaan yang sesuai
- menawarkan serangkaian perintah yang dipilih dengan cermat untuk menyeimbangkan minimalisme dan kegunaan
- terus menargetkan performa mentah terbaik
- disesuaikan dengan mekanisme OS modern
- menyediakan beberapa mekanisme persistensi karena pendekatan "satu ukuran cocok untuk semua" hanyalah mimpi.
- menyediakan blok pembangun untuk mekanisme HA (misalnya sistem replikasi)
- menghindari menumpuk lapisan abstraksi yang tidak berguna seperti pancake
- menghasilkan basis kode yang bersih dan mudah dipahami sehingga pengembang C yang baik dapat merasa nyaman dengan