Artikel ini membawa anda pengetahuan yang berkaitan tentang jenis data dalam Redis Ia terutamanya memperkenalkan isu yang berkaitan dengan senario penggunaan jenis data yang biasa saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: Tutorial pembelajaran Redis
Jenis data dan senario penggunaan Redis
Berbanding dengan pangkalan data KV lain, salah satu ciri utama Redis ialah ia menyokong jenis data yang kaya. Ia menyokong sejumlah 5 jenis data 5 jenis data ini, senario penggunaannya dan pelaksanaan dalaman diperkenalkan satu demi satu di bawah.
rentetan
Pengenalan: Jenis rentetan ialah jenis data paling asas dalam Redis, jenis data yang paling biasa digunakan, malah digunakan oleh ramai pemain sebagai satu-satunya jenis data redis. Jenis rentetan adalah selamat binari dalam redis, yang bermaksud bahawa nilai rentetan mengambil berat tentang rentetan binari dan tidak mengambil berat tentang format tertentu Anda boleh menggunakannya untuk menyimpan rentetan dalam format json atau format imej JPEG.
Dapatkan panjang rentetan
Tambahkan kandungan pada rentetan
Tetapkan dan dapatkan rentetan Sekeping kandungan tertentu
Tetapkan dan dapatkan sedikit rentetan tertentu
Tetapkan kumpulan kandungan siri rentetan
Arahan biasa: set, get, decr, incr, mget, dsb.
Senario aplikasi:
(1) Simpan nilai medan dalam MySQL
Reka bentuk kunci sebagai nama jadual: nama kunci utama: nilai kunci utama: Nama medan
(2) Objek storan
Jenis rentetan menyokong rentetan dalam sebarang format Yang paling biasa digunakan ialah menyimpan rentetan yang diformatkan oleh json atau objek lain. (Adalah disyorkan untuk menggunakan jenis data cincang dalam senario ini)
set user:id:1 '[{"id":1,"name":"zj","email":"156577812@qq.com"},{"id":1,"name":"zj","email":"156577812@qq.com"}]'
(3) Jana id penambahan automatik
Apabila nilai jenis rentetan redis dalam bentuk integer, redis boleh merawat ia sebagai integer Lakukan operasi kenaikan (incr) dan penurunan (decr). Memandangkan semua operasi redis adalah atom, tidak perlu risau tentang masalah transaksi yang mungkin berlaku apabila berbilang pelanggan menyambung.
Arahan biasa: hget, hset, hgetall, dsb.
Senario aplikasi:
Simpan data berstruktur, seperti maklumat pengguna. Dalam Memcached atau CKV, untuk maklumat pengguna seperti nama panggilan pengguna, umur, jantina, mata, dan lain-lain, kita perlu mensirikannya terlebih dahulu dan menyimpannya sebagai nilai rentetan Pada masa ini, apabila kita perlu mengubah suai salah satu item , kita biasanya perlu Selepas nilai dikeluarkan dan dinyahsiri, nilai item diubah suai, dan kemudian bersiri dan disimpan semula. Ini bukan sahaja meningkatkan overhed, tetapi juga tidak sesuai untuk situasi di mana operasi serentak mungkin (contohnya, dua operasi serentak memerlukan pengubahsuaian mata). Struktur Hash Redis membenarkan anda mengubah suai hanya nilai atribut tertentu seperti mengemas kini atribut dalam pangkalan data. Seperti yang ditunjukkan di bawah:
Kunci ialah ID pengguna, nilai ialah Peta, kunci Peta ini ialah nama atribut ahli dan nilai ialah nilai atribut, supaya pengubahsuaian dan akses data boleh terus melalui Map dalamannya (kunci Map dalaman dipanggil medan dalam Redis), iaitu, data atribut yang sepadan boleh dimanipulasi melalui medan kunci (ID pengguna) (label atribut). untuk menyimpan data berulang kali, dan ia tidak akan menyebabkan isu kawalan bersiri dan konkurensi.
Walau bagaimanapun, perlu diperhatikan di sini bahawa Redis menyediakan antara muka (hgetall) untuk mendapatkan secara langsung semua data atribut Walau bagaimanapun, jika terdapat ramai ahli Peta dalaman, ia melibatkan merentasi keseluruhan Peta dalaman model satu benang Redis Oleh itu, operasi traversal ini mungkin memakan masa dan ia tidak akan bertindak balas kepada permintaan daripada pelanggan lain sama sekali. Ini memerlukan perhatian khusus.
boleh digunakan untuk membina indeks. Sebagai contoh, objek Pengguna, sebagai tambahan kepada id, kadangkala juga perlu disoal dengan nama Anda boleh membina Hash dengan kunci user:name:id Apabila memasukkan objek Pengguna (set user:101{"id":101 ,"name":"calvin ”}), dengan cara ini, masukkan entri ke dalam cincang ini (hset user:name:id calvin 101). Pada masa ini, calvin digunakan sebagai kunci dalam cincang, dengan nilai 101. Apabila membuat pertanyaan mengikut nama, gunakan hgetuser:name:id calvin untuk mendapatkan id daripada kunci bernama calvin. Jika anda perlu menggunakan berbilang indeks untuk mencari sekeping data tertentu, anda boleh menggunakan satu kunci cincang untuk mengelak daripada menggunakan berbilang kunci rentetan untuk menyimpan nilai indeks.
HINCRBY juga boleh digunakan untuk melaksanakan idmaker. Berbanding dengan idmaker jenis rentetan, setiap jenis memerlukan kunci dan jenis cincang hanya memerlukan satu kunci.
Jenis data cincang mempunyai kelebihan kerana lebih fleksibel dan lebih pantas daripada jenis rentetan apabila menyimpan jenis data di atas Secara khusus, menggunakan jenis rentetan untuk menyimpan, adalah perlu untuk menukar dan menghuraikan format json rentetan, walaupun ia bukan Penukaran diperlukan Dari segi overhed memori, hash masih mempunyai kelebihan.
Kaedah pelaksanaan:
Redis Hash yang sepadan dengan Value sebenarnya ialah HashMap. Terdapat dua pelaksanaan berbeza di sini Apabila Hash mempunyai lebih sedikit ahli, Redis akan menggunakan kaedah seperti tatasusunan satu dimensi untuk menyimpannya secara padat untuk menjimatkan memori. menggunakan Struktur HashMap sebenar, pengekodan nilai redisObject yang sepadan ialah zipmap Apabila bilangan ahli bertambah, ia secara automatik akan ditukar menjadi HashMap sebenar, dan pengekodan adalah ht.
Pengenalan:
senarai ialah senarai terpaut rentetan yang diisih mengikut susunan sisipan, yang boleh be Sisipkan elemen baharu di bahagian kepala dan ekor (dilaksanakan oleh senarai berganda, kerumitan masa untuk menambah elemen pada kedua-dua hujung ialah O(1)). Apabila memasukkan elemen, jika kunci tidak wujud, redis akan mencipta senarai terpaut baharu untuk kunci tersebut Jika semua elemen dalam senarai terpaut dialih keluar, kunci itu juga akan dialih keluar daripada redis.
Arahan biasa: lpush, rpush, lpop, rpop, lrange, dsb.
Senario aplikasi:
Pelbagai senarai, seperti senarai ikuti Twitter, senarai peminat, dsb., kedudukan berita terkini, ulasan pada setiap artikel, dsb. juga boleh dilaksanakan menggunakan struktur senarai Redis .
Baris gilir mesej, anda boleh menggunakan operasi PUSH Senarai untuk menyimpan tugasan dalam Senarai, dan kemudian urutan pekerja menggunakan operasi POP untuk mengeluarkan tugasan untuk dilaksanakan. Baris gilir mesej di sini tidak mempunyai mekanisme ack Bagaimana jika pengguna memberikan tugas kepada Pop dan ranap sebelum menyelesaikannya? Satu penyelesaian ialah menambah set diisih tambahan Apabila mengedarkan, menghantarnya ke senarai dan menyusun set pada masa yang sama dalam set yang diisih dan keluarkan kerja secara berkala daripada set yang diisih Keluarkan tugasan yang belum selesai yang telah tamat masa dan letakkannya semula ke dalam senarai. Pendekatan lain ialah menambah senarai tambahan untuk setiap pekerja, gunakan RPopLPush apabila muncul tugasan, letakkan tugas itu ke dalam senarai pekerja sendiri pada masa yang sama dan gunakan LREM untuk menghapuskannya apabila selesai. Jika pengurusan kluster (seperti penjaga zoo) mendapati bahawa pekerja telah meninggal dunia, kandungan senarai pekerja akan dikembalikan ke senarai utama.
Menggunakan LRANGE boleh merealisasikan fungsi halaman kandungan senarai dengan mudah.
Operasi untuk mendapatkan data N terkini: LPUSH digunakan untuk memasukkan ID kandungan dan menyimpannya sebagai kata kunci di kepala senarai. LTRIM digunakan untuk mengehadkan bilangan item dalam senarai kepada maksimum 5000. Jika jumlah data yang perlu diambil oleh pengguna melebihi kapasiti cache ini, maka permintaan itu perlu dihantar ke pangkalan data.
Kaedah pelaksanaan:
Senarai Redis dilaksanakan sebagai senarai terpaut dua hala, yang boleh menyokong carian terbalik dan traversal, menjadikannya lebih mudah untuk dikendalikan, tetapi ia membawa beberapa overhed memori tambahan. Redis dalaman Banyak pelaksanaan, termasuk menghantar baris gilir penimbal, dsb., juga menggunakan struktur data ini.
Pengenalan: Ia adalah set yang tidak tertib. Meletakkan elemen pendua ke dalam Set akan mengalih keluarnya secara automatik.
Perintah biasa:
sadd, spop, smembers, sunion, dsb.
Senario aplikasi:
Sesetengah senarai yang perlu dinyahduplikasi dan ditetapkan menyediakan antara muka penting untuk menentukan sama ada ahli berada dalam koleksi set, yang merupakan sesuatu yang tidak dapat disediakan oleh senarai.
boleh menyimpan beberapa data kolektif Contohnya, dalam aplikasi Weibo, semua pengikut pengguna boleh disimpan dalam koleksi, dan semua peminatnya boleh disimpan dalam koleksi. Redis juga menyediakan operasi seperti persimpangan, kesatuan, dan perbezaan untuk koleksi, yang boleh menjadi sangat mudah untuk melaksanakan fungsi seperti perhatian biasa, pilihan biasa dan rakan peringkat kedua Untuk semua operasi pengumpulan di atas, anda juga boleh menggunakan arahan yang berbeza Kembalikan keputusan kepada pelanggan atau simpan dalam koleksi baharu. Untuk contoh lain, QQ mempunyai fungsi sosial yang dipanggil "Teg Rakan". Anda boleh menandai rakan anda, seperti "cantik besar", "taikun", "Ouba", dll. Di sini anda juga boleh menyimpan teg setiap pengguna dalam koleksi. .
Jika anda ingin mengetahui bilangan pengguna berdaftar atau alamat IP tertentu telah melawat halaman tertentu, anda boleh melakukan ini: SADD page:day1:
Kaedah pelaksanaan:
Pelaksanaan dalaman set ialah HashMap yang nilainya sentiasa batal Malah, ia diisih dengan cepat dengan mengira cincangan Ini juga yang boleh disediakan oleh set untuk menentukan sama ada ahli adalah Sebab dalam set.
Pengenalan: Set tersusun, berbanding set, elemen perlu disediakan apabila ia diletakkan ke dalam set Skor elemen boleh diisih secara automatik berdasarkan skor.
Arahan biasa:
zadd, zrange, zrem, zcard, dsb.
Senario penggunaan:
Simpan senarai set yang tersusun dan bukan pendua, Sebagai contoh, garis masa awam Twitter boleh disimpan dengan masa penerbitan sebagai skor, supaya ia akan diisih secara automatik mengikut masa apabila diambil.
Anda boleh membuat baris gilir berwajaran Contohnya, skor mesej biasa ialah 1, dan skor mesej penting ialah 2. Kemudian urutan pekerja boleh memilih untuk mendapatkan tugasan kerja dalam susunan terbalik. skor. Utamakan tugas penting.
Pemprosesan item tamat tempoh: Gunakan masa unix sebagai kunci untuk memastikan senarai diisih mengikut masa. Dapatkan semula masa_masa dan masa_untuk_hidup untuk menyelesaikan tugas sukar mencari item tamat tempoh. Tugas latar belakang lain menggunakan ZRANGE...WITHSCORES untuk bertanya dan memadamkan entri yang telah tamat tempoh.
Kaedah pelaksanaan:
Set isih Redis secara dalaman menggunakan HashMap dan langkau senarai (SkipList) untuk memastikan penyimpanan dan susunan data HashMap meletakkan pemetaan daripada ahli kepada markah, dan langkau Semua ahli disimpan dalam jadual, dan asas pengisihan ialah skor yang disimpan dalam HashMap Menggunakan struktur jadual lompat boleh mencapai kecekapan carian yang lebih tinggi, dan agak mudah untuk dilaksanakan.
Pembelajaran yang disyorkan: Tutorial video Redis
Atas ialah kandungan terperinci Ringkaskan jenis data dan senario penggunaan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!