Rumah >pangkalan data >Redis >Bagaimana untuk menganalisis mata pengetahuan Redis
ialah struktur data dan bukannya jenis
Banyak artikel akan mengatakan bahawa redis menyokong 5 jenis data yang biasa digunakan Ini sebenarnya kekaburan yang besar. Semua data perduaan yang disimpan dalam redis sebenarnya ialah tatasusunan bait (bait[]) Data bait ini hanya boleh ditukar menjadi rentetan, integer atau objek selepas menyahkodnya dalam format yang munasabah mempunyai jenis data.
Ini mesti diingat. Jadi apa-apa yang boleh ditukar kepada tatasusunan bait (bait[]) boleh disimpan dalam redis. Selagi ia ditukar kepada tatasusunan bait, sama ada rentetan, nombor, objek, gambar, bunyi, video atau fail, ia boleh diproses.
Oleh itu, String dalam redis tidak merujuk kepada rentetan Ia sebenarnya mewakili struktur data yang paling mudah, iaitu, satu kunci hanya boleh sepadan dengan satu nilai. Kunci dan nilai di sini ialah kedua-dua tatasusunan bait, tetapi kuncinya biasanya tatasusunan bait yang ditukar daripada rentetan, dan nilainya ditentukan mengikut keperluan sebenar.
Dalam keadaan tertentu, terdapat juga beberapa keperluan untuk nilai Contohnya, jika operasi kenaikan automatik atau pengurangan kendiri hendak dilakukan, tatasusunan bait yang sepadan dengan nilai mesti boleh dinyahkodkan menjadi. nombor, jika tidak ralat akan dilaporkan.
Kemudian struktur data Senarai sebenarnya bermakna satu kunci boleh sepadan dengan berbilang nilai, dan nilainya adalah teratur, dan nilai nilai boleh diulang.
Set ialah struktur data yang menunjukkan bahawa satu kunci boleh sepadan dengan berbilang nilai, dan tiada susunan antara nilai dan nilai nilai tidak boleh diulang.
Cincang ialah struktur data yang menunjukkan bahawa satu kunci boleh sepadan dengan berbilang pasangan nilai kunci Pada masa ini, susunan antara pasangan nilai kunci ini secara umumnya mempunyai sedikit makna. Struktur data, bukan semantik kedudukan.
Set Diisih ialah struktur data yang menunjukkan bahawa satu kunci boleh sepadan dengan berbilang nilai Nilai diisih mengikut saiz, dan nilai tidak boleh diulang. Setiap nilai dikaitkan dengan nombor titik terapung yang dipanggil skor. Peraturan pengisihan untuk elemen ialah: isih mengikut skor dahulu, kemudian isi mengikut nilai.
Saya percaya kini anda mempunyai pemahaman yang lebih jelas tentang lima struktur data ini, maka arahan yang sepadan akan menjadi kes kecil untuk anda.
Masalah dan penyelesaian yang dibawa oleh kluster
Kelebihan yang dibawa oleh kluster adalah jelas, termasuk peningkatan kapasiti, peningkatan keupayaan pemprosesan dan penskalaan dinamik mengikut keperluan. Tetapi ia juga akan memperkenalkan beberapa masalah baru, sekurang-kurangnya dua yang berikut.
Peruntukan data termasuk menentukan nod tempat data disimpan semasa penyimpanan dan menentukan nod tempat data disoal semasa pengambilan semula. Yang kedua ialah pergerakan data: apabila gugusan mengembang dan nod baharu ditambah, dari mana datangnya data pada nod itu apabila gugusan mengecut dan nod dialih keluar, ke mana perginya data pada nod itu.
Dua masalah di atas mempunyai satu persamaan, iaitu cara menerangkan dan menyimpan hubungan pemetaan antara data dan nod. Evolusi masalah terletak pada keperluan untuk mewujudkan perkaitan antara setiap kunci dan semua nod dalam kelompok, kerana lokasi data ditentukan oleh kunci.
Nod gugusan adalah agak tetap dan sedikit, walaupun terdapat nod ditambah dan nod dialih keluar. Dalam kelompok, kunci yang disimpan adalah dalam jumlah yang besar, rawak sepenuhnya, tidak teratur, tidak dapat diramalkan dan kebanyakannya remeh.
Ini seperti hubungan antara universiti dan semua pelajarnya. Jika universiti dan pelajar dikaitkan secara langsung, ia pasti akan mengelirukan. Realitinya ialah terdapat beberapa lapisan ditambah antara mereka, pertama ada jabatan, kemudian ada jurusan, kemudian ada gred, dan akhirnya ada kelas. Selepas empat peringkat pemetaan ini, hubungan menjadi lebih jelas.
Tiada masalah yang tidak boleh diselesaikan dengan menambah lapisan Ini adalah kesimpulan yang sangat penting. Jika ya, tambah satu lagi lapisan. Perkara yang sama berlaku dalam komputer.
Redis menambah satu lagi lapisan antara data dan nod Lapisan ini dipanggil slot, kerana slot terutamanya berkaitan dengan pencincangan, juga dipanggil slot cincang.
*** menjadi, nod diletakkan dengan slot, dan slot diletakkan dengan data. Slot menyelesaikan masalah butiran, yang bersamaan dengan menjadikan butiran lebih besar, yang memudahkan pergerakan data. Teknologi cincang digunakan untuk menyelesaikan masalah pemetaan Ia menggunakan nilai cincang kunci untuk mengira slot di mana ia terletak untuk memudahkan pengedaran data.
Buku-buku di atas meja belajar anda bertimbun-timbun dan bersepah-sepah, dan amat sukar untuk mencari satu daripadanya. Anda membeli beberapa tong penyimpanan yang besar, menyusun buku ke dalam tong yang berbeza mengikut panjang tajuknya, dan meletakkannya di atas meja.
Itu sahaja, terdapat kotak penyimpanan di atas meja, dan terdapat buku di dalam kotak penyimpanan. Ini memudahkan untuk mengalihkan buku, cuma ambil kotak dan pergi. Anda boleh mencari buku yang anda perlukan dengan mudah dengan hanya mengukur panjang tajuk dan menuju ke kotak yang sepadan.
Sebenarnya, kami tidak berbuat apa-apa, kami hanya membeli beberapa kotak dan mengemas buku ke dalam kotak mengikut peraturan tertentu. Hanya satu langkah mudah mengubah keadaan yang asalnya kucar-kacir. Bukankah ia sedikit ajaib?
Sebuah kluster hanya boleh mempunyai 16384 slot, bernombor 0-16383. Slot ini diperuntukkan kepada semua nod induk dalam kelompok, dan tiada keperluan untuk dasar peruntukan. Anda boleh menentukan slot bernombor yang diberikan kepada nod induk mana. Kelompok akan merekodkan hubungan yang sepadan antara nod dan slot.
Seterusnya, anda perlu mencincang kunci, membahagikan hasilnya dengan 16384 dan mengambil bakinya akan menentukan ke dalam slot mana kunci itu jatuh. slot = CRC16(kunci) % 16384.
Pindahkan data dalam unit slot Kerana bilangan slot tetap, ia lebih mudah untuk diproses, jadi masalah pergerakan data diselesaikan.
Gunakan fungsi cincang untuk mengira nilai cincang kekunci, supaya slot yang sepadan boleh dikira, dan kemudian gunakan hubungan pemetaan antara slot dan nod yang disimpan dalam kelompok untuk menanyakan nod di mana slot terletak, jadi data dan nod adalah Pemetaan, jadi masalah peruntukan data diselesaikan.
Apa yang saya ingin katakan ialah orang biasa hanya akan mempelajari pelbagai teknologi yang lebih penting tentang cara keluar dari teknologi, mencari penyelesaian atau arah pemikiran, dan pergi ke arah ini awak nak.
Operasi arahan pilihan Kluster
Selagi pelanggan mewujudkan pautan dengan satu nod dalam kluster, ia boleh mendapatkan semua maklumat nod bagi keseluruhan kluster. Selain itu, maklumat perhubungan yang sepadan bagi semua slot cincang dan nod akan diperolehi Data maklumat ini akan dicache pada klien kerana maklumat ini agak berguna.
Klien boleh menghantar permintaan kepada mana-mana nod, jadi nod mana yang harus ia hantar permintaan selepas mendapat kunci Sebenarnya, ia adalah untuk memindahkan teori hubungan pemetaan antara kunci dan nod masuk? kelompok kepada pelanggan Itu sahaja.
Jadi, pelanggan perlu melaksanakan fungsi cincang yang sama seperti bahagian kluster Mula-mula hitung nilai cincang kunci, dan kemudian ambil baki 16384. Dengan cara ini, slot cincang sepadan dengan kunci. ditemui. Gunakan Nod yang sepadan dengan kunci boleh didapati berdasarkan maklumat hubungan yang sepadan antara slot dan nod yang dicache oleh klien.
Hantar sahaja permintaan. Anda juga boleh cache perhubungan pemetaan antara kunci dan nod Pada kali seterusnya anda meminta kunci, anda akan mendapat nod yang sepadan secara langsung tanpa perlu mengiranya lagi.
Walaupun cache pelanggan belum dikemas kini, kluster telah berubah, menunjukkan jurang antara teori dan realiti. Besar kemungkinan kunci yang diminta daripada nod yang sepadan tidak lagi pada nod itu. Apakah yang perlu dilakukan oleh nod ini pada masa ini?
Nod ini boleh pergi ke nod di mana kunci sebenarnya berada untuk mendapatkan data dan mengembalikannya kepada klien, atau ia boleh memberitahu secara langsung kepada klien bahawa kunci itu tidak lebih lama dengan saya dan lampirkan kunci pada masa yang sama Biarkan klien meminta maklumat nod semasa sekali lagi, serupa dengan ubah hala 302 HTTP.
Ini sebenarnya persoalan pilihan dan persoalan falsafah. Hasilnya ialah kluster redis memilih yang terakhir. Oleh itu, nod hanya memproses kunci yang dimilikinya untuk kunci yang tidak dimilikinya, ia akan mengembalikan ralat pengalihan, iaitu, -MOVED key 127.0.0.1:6381, dan klien akan menghantar semula permintaan kepada nod baharu ini.
Jadi pilihan adalah falsafah dan kebijaksanaan. Lebih lanjut mengenai ini kemudian. Mari kita lihat situasi lain dahulu, yang mempunyai beberapa persamaan dengan masalah ini.
Redis mempunyai arahan yang boleh membawa berbilang kunci pada satu masa, seperti MGET saya panggil arahan berbilang kunci ini. Permintaan untuk arahan berbilang kunci ini dihantar ke nod Terdapat masalah yang berpotensi di sini. Saya tertanya-tanya jika anda telah memikirkannya, iaitu, mesti berbilang kunci dalam perintah ini terletak pada nod yang sama?
Ia terbahagi kepada dua situasi Jika berbilang kunci tidak berada pada nod yang sama, nod hanya boleh mengembalikan ralat pengalihan Walau bagaimanapun, berbilang kunci mungkin terletak pada berbilang nod yang berbeza akan menjadi sangat mengelirukan, jadi kelompok redis memilih untuk tidak menyokong keadaan ini.
Jika berbilang kunci terletak pada nod yang sama, tiada masalah secara teori sama ada gugusan redis menyokongnya bergantung pada versi redis. Hanya mengujinya sendiri apabila menggunakannya.
Semasa proses ini, kami menemui satu perkara yang sangat bermakna, iaitu, adalah sangat perlu untuk memetakan sekumpulan kunci yang berkaitan ke nod yang sama Ini boleh meningkatkan kecekapan dan menghantar berbilang perintah sekaligus .
Maka persoalannya ialah, bagaimana untuk menamakan kunci ini supaya ia jatuh pada nod yang sama. Adakah mungkin kita perlu mengira nilai cincang terlebih dahulu dan kemudian mengambil yang selebihnya Ia akan menjadi terlalu menyusahkan? Sudah tentu ini tidak berlaku, redis telah memikirkannya untuk kami.
Taakulan mudah, jika anda mahu dua kunci berada pada nod yang sama, nilai cincangnya mestilah sama. Untuk nilai cincang adalah sama, rentetan yang dihantar ke dalam fungsi cincang mestilah sama. Jika kita hanya melepasi dua rentetan yang sama, maka dua rentetan itu akan dianggap sebagai kunci yang sama, dan data seterusnya akan menimpa data sebelumnya.
Masalahnya di sini ialah kami menggunakan keseluruhan kunci untuk mengira nilai cincang, yang membawa kepada gandingan kunci dan rentetan yang terlibat dalam mengira nilai cincang, iaitu kunci dan rentetan yang terlibat dalam pengiraan nilai cincang Pengkomputeran rentetan adalah berkaitan tetapi berbeza.
Redis menyediakan kami penyelesaian berdasarkan prinsip ini, dipanggil teg cincang utama. Mari lihat contoh dahulu, {user1000}.following, {user1000}.followers, saya percaya anda telah melihat helahnya, iaitu hanya menggunakan rentetan antara { dan } dalam Kekunci untuk mengambil bahagian dalam mengira nilai cincang.
Ini memastikan bahawa nilai cincang adalah sama dan jatuh pada nod yang sama. Tetapi kuncinya berbeza dan tidak akan meliputi satu sama lain. Dengan menggunakan tag cincang untuk mengaitkan set kunci yang berkaitan, masalah itu diselesaikan dengan gembira dan mudah.
Penyelesaian masalah bergantung pada kreativiti dan idea yang bijak dan bukannya penggunaan teknologi dan algoritma yang hebat. Ini Xiaoqiang, kecil tetapi berkuasa.
Akhir sekali, mari kita bercakap tentang falsafah pilihan. Ciri utama Redis adalah untuk melaksanakan penyimpanan nilai kunci dan capaian struktur data yang biasa digunakan dalam masa yang sesingkat mungkin, serta melaksanakan operasi yang berkaitan pada struktur data ini. Kami memilih untuk melemahkan atau tidak memproses apa-apa yang tiada kaitan dengan teras atau yang akan menyeret teras ke bawah Ini untuk memastikan teras itu mudah, cepat dan stabil.
Malah, dalam menghadapi keluasan dan kedalaman, redis memilih kedalaman. Oleh itu, nod tidak memproses kunci yang tidak dimilikinya dan kluster tidak menyokong arahan untuk berbilang kunci. Dengan cara ini, dalam satu pihak, pelanggan boleh bertindak balas dengan cepat, dan sebaliknya, sejumlah besar penghantaran dan penggabungan data boleh dielakkan dalam kelompok.
Model benang tunggal
Hanya terdapat satu urutan dalam setiap nod kelompok redis yang bertanggungjawab untuk menerima dan melaksanakan semua permintaan yang dihantar oleh pelanggan. Secara teknikal, I/O berganda digunakan, menggunakan fungsi epoll Linux, supaya satu benang boleh menguruskan banyak sambungan soket.
Selain itu, terdapat sebab berikut untuk memilih utas tunggal:
1 Redis beroperasi pada memori dan sangat pantas (10W+QPS)
2. Keseluruhan. masa digunakan terutamanya dalam penghantaran rangkaian
3. Jika berbilang benang digunakan, penyegerakan berbilang benang diperlukan, yang akan menjadi rumit untuk dilaksanakan
4. Masa mengunci benang pun melebihi masa operasi memori
5. Penukaran konteks berbilang benang yang kerap menggunakan lebih banyak masa CPU
6 Terdapat juga sokongan semula jadi untuk operasi atom satu utas, dan kod satu utas lebih mudah tulis
Transaksi
Semua orang tahu bahawa urus niaga adalah untuk menggabungkan berbilang operasi bersama-sama, atau melaksanakan semuanya (berjaya ), atau tiada satu pun daripadanya dilaksanakan (digulung semula). Redis juga menyokong transaksi, tetapi ia mungkin bukan yang anda mahukan.
Transaksi Redis boleh dibahagikan kepada dua langkah, mentakrifkan transaksi dan melaksanakan transaksi. Selepas memulakan urus niaga, tambah semua arahan untuk dilaksanakan mengikut tertib. Ini mentakrifkan transaksi. Anda boleh melaksanakan transaksi menggunakan perintah exec pada ketika ini, atau meninggalkannya dengan arahan buang..
Anda mungkin berharap bahawa kunci yang anda sayangi tidak mahu dikendalikan oleh orang lain sebelum transaksi anda bermula pelaksanaan, transaksi akan dibatalkan daripada. Anda juga boleh menggunakan arahan unwatch untuk membatalkan pemantauan kekunci ini.
Transaksi Redis mempunyai ciri-ciri berikut:
1 Jika ralat berlaku sebelum memulakan transaksi, semua arahan tidak akan dilaksanakan
2 dijamin akan dilaksanakan sekali Laksanakan mengikut urutan tanpa diganggu
3 Jika ralat ditemui semasa pelaksanaan, pelaksanaan akan diteruskan tanpa henti
4 rollback
Membaca huraian di atas membuatkan saya mempersoalkan sama ada ini boleh dipanggil transaksi. Jelas sekali, ini berbeza sama sekali daripada apa yang biasa kita fahami sebagai urus niaga, kerana ia tidak dijamin menjadi atom. Redis tidak menyokong atomicity kerana ia tidak menyokong rollback, dan ada sebab mengapa ciri ini tidak disokong. | .
Proses interaksi antara klien dan kluster adalah sekatan bersiri, iaitu selepas klien menghantar arahan, ia mesti menunggu sehingga respons datang semula sebelum ia boleh menghantar arahan kedua adalah masa pergi dan balik. Jika anda mempunyai banyak arahan dan anda melakukannya satu demi satu, ia akan menjadi sangat perlahan. Redis menyediakan teknologi saluran paip yang membolehkan pelanggan menghantar berbilang arahan pada satu masa tanpa menunggu jawapan daripada pelayan Selepas semua arahan dihantar, semua respons kepada arahan ini akan diterima secara bergilir. Ini sangat menjimatkan banyak masa dan meningkatkan kecekapan. Jika anda bijak, adakah anda menyedari masalah yang lain? Bukankah ini operasi berbilang kunci? semua pada nod yang sama, haha, kelompok redis telah melepaskan sokongan untuk saluran paip lagi. Walau bagaimanapun, ia boleh disimulasikan pada bahagian klien, iaitu, menggunakan berbilang sambungan untuk menghantar arahan kepada berbilang nod pada masa yang sama, kemudian menunggu semua nod mengembalikan respons, kemudian menyusunnya mengikut susunan di mana arahan dihantar, dan mengembalikannya kepada kod Pengguna. Aduh, menyusahkan sekali.Protokol
Fahami secara ringkas protokol redis dan ketahui format penghantaran data redis. Protokol untuk menghantar permintaan: *bilangan parameter CRLF$bilangan bait parameter 1 data CRLF parameter 1 CRLF...$bilangan bait parameter N CRLF data parameter N CRLFSebagai contoh, SET nama lixinjie, data sebenar yang dihantar ialah: *3rn$3rnSETrn$4rnnamern$8rnlixinjiernProtokol untuk menerima respons:
Balas baris tunggal, bait pertama ialah + mesej ralat, bait pertama ialah -integer, bait pertama ialah:Batch batch, yang pertama bait ialah $Balasan berbilang kelompok, bait pertama ialah *Sebagai contoh, +OKrn-Operasi ERR terhadaprn:1000rn$6rnfoobarrn*2rn$3rnfoorn$3rnbarrn
Ia boleh dilihat bahawa protokol redis direka untuk menjadi sangat mudah.
Atas ialah kandungan terperinci Bagaimana untuk menganalisis mata pengetahuan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!