Mengapa Redis berulir tunggal dan mengapa Redis begitu pantas!
Why Is Redis Single Threaded
Pertama, Pengenalan Redis
Redis adalah sistem penyimpanan struktur data sumber terbuka dalam memori yang dapat digunakan sebagai: pangkalan data, cache, dan perisian tengah pesanan.
Ia menyokong pelbagai jenis struktur data seperti String, Hash, List, Set, Set Ordered (Sorted Set or ZSet) dan Range Query, Bitmap, Hyperloglogs dan Geospatial index radius query. Jenis struktur data yang biasa adalah: String, List, Set, Hash, dan ZSet.
Redis mempunyai replikasi bawaan, skrip LUA, acara pemacu LRU (LRU)
pengusiran), urus niaga (Transaksi) dan tahap ketekunan cakera yang berbeza (Kegigihan), dan melalui
Redis sentinel (Sentinel) dan partition automatik (Cluster) menyediakan ketersediaan tinggi (Ketersediaan Tinggi).
Redis juga menyediakan pilihan untuk kegigihan yang membolehkan pengguna menyimpan data mereka sendiri ke disk untuk penyimpanan. Sesuai dengan situasi sebenarnya, set data dapat diekspor ke disk (snapshot) secara berkala, atau ditambahkan ke log perintah (AOF hanya menambahkan file), dan dia akan menyalin perintah tulis yang dilaksanakan ke hard disk ketika menjalankan perintah tulis. . Anda juga dapat mematikan kegigihan dan menggunakan Redis sebagai ciri data cache rangkaian yang cekap.
Redis tidak menggunakan jadual, dan pangkalan data tidak menentukan sebelumnya atau memaksa pengguna untuk mengaitkan data yang berbeza yang disimpan di Redis.
Mod kerja pangkalan data boleh dibahagikan kepada: pangkalan data cakera keras dan pangkalan data dalam memori mengikut mod penyimpanan. Redis menyimpan data dalam memori, dan membaca dan menulis data tanpa dibatasi oleh kelajuan I / O cakera keras, jadi sangat cepat.
(1) Mod kerja pangkalan data cakera keras:
(2) Mod kerja pangkalan data dalam memori:
Setelah membaca keterangan di atas, adakah anda mengetahui beberapa soalan temu ramah yang berkaitan dengan Redis, seperti: Apakah jenis struktur data biasa Redis, Redis, dan bagaimana Redis berterusan.
Kedua, seberapa pantas Redis?
Redis menggunakan pangkalan data KV berasaskan memori dengan satu proses, model utas tunggal yang ditulis dalam C. Data rasmi adalah 100,000+ QPS (jumlah pertanyaan sesaat). Data ini tidak lebih buruk daripada pangkalan data KV berasaskan memori yang sama Memcached dengan proses tunggal multithreading! Sekiranya anda berminat, anda boleh merujuk kepada program penanda aras rasmi untuk menguji 'Berapa cepat Redis?' 》 https://redis.io/topics/benchmark)
Tulis keterangan gambar di sini
Paksi mendatar adalah bilangan sambungan dan paksi menegak adalah QPS. Pada ketika ini, gambar ini menggambarkan susunan besarnya. Saya harap semua orang dapat menerangkannya dengan betul semasa temu ramah. Apabila anda tidak memintanya, susunan jawapan anda sangat berbeza!
Ketiga, mengapa Redis begitu pantas?
1, sepenuhnya berdasarkan memori, kebanyakan permintaan adalah operasi memori murni, sangat cepat. Data ada dalam memori, serupa dengan HashMap. Kelebihan HashMap adalah bahawa kerumitan masa pencarian dan operasi adalah O (1)
2, struktur data sederhana, operasi data juga sederhana, struktur data di Redis dirancang khusus
3, menggunakan satu utas, untuk mengelakkan pertukaran konteks dan keadaan perbalahan yang tidak perlu, tidak ada pertukaran multi-proses atau multi-thread yang disebabkan oleh penggunaan CPU, tidak perlu mempertimbangkan pelbagai kunci, tidak ada operasi kunci pelepasan kunci , tiada penggunaan Prestasi kerana kemungkinan kebuntuan
4. Gunakan model multiplexing I / O berbilang saluran, IO tanpa sekatan
5, menggunakan model yang mendasari adalah berbeza, implementasi yang mendasari antara mereka dan protokol aplikasi untuk komunikasi dengan klien adalah berbeza, Redis langsung membangun mekanisme VM, kerana sistem umum memanggil fungsi sistem, ia akan membuang sejumlah waktu untuk bergerak Dan meminta
Perkara di atas lebih difahami. Di bawah ini kita akan membincangkan secara ringkas model multiplexing I / O berbilang saluran:
(1) Model multiplexing I / O berganda
Multiple I / O model multiplexing adalah kemampuan untuk memantau secara serentak peristiwa I / O pelbagai aliran dengan menggunakan select, poll, dan epoll.
Apabila terbiar, utas semasa akan disekat. Apabila satu atau lebih aliran mempunyai acara I / O, mereka akan bangun dari keadaan penyekat, jadi program ini akan membuat tinjauan setiap masa. Aliran (epoll hanya memeriksa aliran yang benar-benar mengirim acara), dan hanya memproses aliran siap secara berurutan, yang menghindari banyak operasi yang tidak berguna.
Di sini 'multipel' merujuk kepada beberapa sambungan rangkaian, dan 'multiplexing' merujuk kepada multiplexing thread yang sama. Multiplexing I / O berbilang saluran
Teknologi ini membolehkan satu utas memproses banyak permintaan sambungan dengan berkesan (meminimumkan masa yang dihabiskan di rangkaian IO), dan Redis mengoperasikan data dalam memori dengan sangat cepat, yang bermaksud bahawa ia berada dalam memori. Operasi tidak akan menjadi hambatan yang mempengaruhi prestasi Redis. Perkara di atas telah menjadikan Redis mempunyai throughput yang tinggi.
Keempat, mengapa Redis berulir tunggal?
Kita mesti memahami bahawa semua analisis di atas adalah untuk mewujudkan suasana Redis yang cepat! Soalan Lazim rasmi mengatakan bahawa kerana Redis adalah operasi berasaskan memori, CPU bukan penghambat Redis. Kemungkinan Redis kemungkinan besar adalah saiz memori mesin atau lebar jalur rangkaian. Oleh kerana single-threading mudah dilaksanakan, dan CPU tidak menjadi hambatan, adalah logik untuk menggunakan penyelesaian single-threaded (bagaimanapun, menggunakan banyak utas akan menghadapi banyak masalah!).
boleh merujuk kepada: https://redis.io/topics/faq
Melihat ini, anda mungkin menangis! Saya berpendapat bahawa akan ada perkara teknikal utama yang menjadikan Redis menggunakan single thread menjadi begitu pantas. Saya tidak menyangka akan menjadi pegawai yang seolah-olah memperbodohkan kami! Walau bagaimanapun, kita sudah dapat menjelaskan dengan jelas mengapa Redis begitu cepat, dan kerana sudah sangat cepat dalam kes mod single-threaded, tidak perlu menggunakan multi-threading!
Namun, kami tidak dapat menggunakan prestasi CPU multi-teras dalam pendekatan satu utas, tetapi kami dapat melakukannya dengan membuka beberapa contoh Redis pada satu mesin!
Amaran 1: Di sini kami telah menekankan satu utas, hanya semasa memproses permintaan rangkaian kami, hanya satu utas yang perlu ditangani, Pelayan Redis formal mestilah lebih dari satu utas semasa berjalan, di sini anda perlu memperhatikannya! Sebagai contoh, apabila Redis berterusan, ia akan dijalankan sebagai proses anak atau utas anak (khususnya, utas anak atau proses anak lebih jauh dikaji oleh pembaca) misalnya, saya melihat proses Redis pada pelayan ujian, dan kemudian cari utas dalam proses:
Parameter '-T' perintah ps menunjukkan bahawa utas paparan (tunjukkan utas, mungkin dengan lajur SPID.) Lajur 'SID' menunjukkan ID utas, sementara lajur 'CMD' menunjukkan nama utas.
Amaran 2: Pada perenggan terakhir Soalan Lazim di atas, cara untuk menyokong multi-threading dari Redis 4.0 dijelaskan, tetapi hanya operasi multi-utas yang dilakukan pada beberapa operasi! Oleh itu, sama ada artikel itu masih utuh dalam versi yang akan datang memerlukan pembaca meneliti!
Lima, perhatikan
1. Kami tahu bahawa Redis menggunakan 'model single-threaded-multiplexed IO' untuk melaksanakan perkhidmatan data dalam memori berprestasi tinggi. Mekanisme ini mengelakkan penggunaan kunci, tetapi pada masa yang sama lebih memakan masa untuk melakukan sunion. Urutan akan menyebabkan persamaan redis menurun. Oleh kerana ia adalah satu utas, hanya satu operasi yang sedang berjalan dalam satu waktu, jadi perintah yang memakan waktu dapat menyebabkan penurunan serentak, tidak hanya membaca serentak, tetapi menulis bersamaan juga akan turun. Satu utas hanya dapat menggunakan satu inti CPU, jadi anda dapat memulai beberapa contoh dalam pelayan multi-teras yang sama untuk membentuk bentuk master-master atau master-slave. Perintah membaca yang memakan masa dapat dilakukan sepenuhnya pada hamba.
Perlu menukar item redis.conf:
pidfile /var/run/redis/redis_6377.pid #pidfile untuk menambah nombor port
port 6377 #Ini mesti diubah
logfile /var/log/redis/redis_6377.log #logfile nama ditambah nombor port
dbfilename dump_6377.rdb #rdbfile ditambah nombor port
2. 'Kami tidak dapat membiarkan sistem operasi memuatkan keseimbangan, kerana kami mengetahui program kami sendiri dengan lebih baik, jadi kami dapat secara manual memperuntukkan inti CPU untuk mereka, untuk tidak menggunakan terlalu banyak CPU, atau membiarkan kami proses penting dan satu Proses susun berkerumun bersama. '.
CPU adalah faktor penting. Kerana ia adalah model utas tunggal, Redis lebih suka CPU cepat cache yang besar dan bukannya multi-teras.
Pada pelayan CPU multicore, prestasi Redis juga bergantung pada konfigurasi NUMA dan lokasi pengikat pemproses. Kesan yang paling jelas ialah penanda aras redis akan menggunakan teras CPU secara rawak. Untuk mendapatkan hasil yang tepat, anda perlu menggunakan alat pemproses tetap (anda boleh menggunakan set tugas di Linux). Cara yang paling berkesan adalah memisahkan klien dan pelayan ke dalam dua CPU yang berbeza untuk menggunakan cache tahap ketiga di kolej dan universiti.
Keenam, pengembangan
Berikut adalah beberapa model yang harus anda ketahui, dan saya ingin anda temu ramah!
1, model multi-proses satu proses: MySQL, Memcached, Oracle (versi Windows)
2, model pelbagai proses: Oracle (versi Linux)
3, Nginx mempunyai dua jenis proses, satu disebut proses Master (setara dengan proses pengurusan), dan yang lain disebut proses Worker (proses kerja sebenarnya). Terdapat dua cara untuk memulakan:
(1) Permulaan proses tunggal: Pada masa ini, hanya ada satu proses dalam sistem, yang berfungsi sebagai peranan proses Master dan juga proses proses Pekerja.
(2) Permulaan pelbagai proses: Pada masa ini, sistem mempunyai satu dan satu proses Master, dan sekurang-kurangnya satu proses Worker berfungsi.
(3) Proses Master terutama melakukan beberapa pekerjaan inisialisasi global dan menguruskan kerja-kerja proses Pekerja dilakukan di Worker.
Artikel rujukan:
1, http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html
dua, http://blog.csdn.net/xxb2008/article/details/42238557
3, http://blog.csdn.net/hobbs136/article/details/7619719
4, http://blog.csdn.net/yushitao/article/details/43565851