Rumah >pangkalan data >Redis >Apakah mata pengetahuan projek redis?
Sorotan projek:
1 Menggunakan Seesion yang diedarkan, berbilang pelayan boleh bertindak balas pada masa yang sama.
2. Gunakan redis sebagai cache untuk meningkatkan kelajuan akses dan keselarasan, mengurangkan tekanan pangkalan data dan menggunakan tag memori untuk mengurangkan akses redis.
3. Gunakan statik halaman untuk mempercepatkan akses pengguna, menambah baik QPS, halaman cache ke penyemak imbas dan memisahkan bahagian hadapan dan bahagian belakang untuk mengurangkan tekanan pelayan.
4. Gunakan baris gilir mesej untuk melengkapkan pesanan tak segerak, memperbaik pengalaman pengguna dan mengurangkan kemuncak dan aliran.
5 Pengoptimuman keselamatan: pengesahan kata laluan md5 berganda, penyembunyian alamat antara muka kilat, pengehadan semasa antara muka dan anti-memberus, kod pengesahan formula matematik.
Mata pengetahuan utama:
Sesi Teragih
Aplikasi sebenar perkhidmatan jualan kilat kami mungkin bukan sahaja digunakan pada satu pelayan, tetapi diedarkan pada berbilang pelayan pada masa ini , jika pengguna log masuk ke pelayan pertama, permintaan pertama pergi ke pelayan pertama, tetapi permintaan kedua pergi ke pelayan kedua, maka maklumat sesi pengguna hilang.
Penyelesaian: Penyegerakan sesi, tidak kira pelayan mana yang diakses, sesi boleh diperolehi, menggunakan kaedah cache redis, dan menggunakan pelayan redis khusus untuk menyimpan maklumat sesi pengguna. Dengan cara ini, sesi pengguna tidak akan hilang. (Setiap kali anda memerlukan sesi, hanya dapatkannya daripada cache)
Redis melegakan tekanan pangkalan data
Projek ini menggunakan teknologi caching secara meluas, termasuk caching maklumat pengguna (sesi teragih), produk maklumat Cache, cache inventori produk, cache pesanan, cache halaman dan cache objek mengurangkan akses kepada pelayan pangkalan data.
Pengenkapsulan kunci cache universal
Satu masalah ialah cara membezakan cache dalam modul yang berbeza, kerana mungkin terdapat nilai kunci yang sama
Penyelesaian: Gunakan kelas abstrak untuk mentakrifkan BaseKey ( Awalan), di mana awalan kunci cache dan masa tamat cache ditakrifkan untuk merangkum kunci cache. Biarkan modul yang berbeza mewarisinya, supaya setiap kali ia disimpan dalam cache modul, awalan khusus cache ditambah, dan masa tamat tempoh yang berbeza boleh ditetapkan secara seragam.
Halaman statik (pemisahan hujung depan dan belakang)
Tujuan utama halaman statik adalah untuk mempercepatkan kelajuan memuatkan halaman, dan menjadikan halaman butiran produk dan butiran pesanan menjadi statik HTML (HTML tulen ), pemuatan data hanya memerlukan permintaan pelayan melalui ajax, dan halaman HTML statik boleh dicache dalam penyemak imbas klien.
Baris gilir mesej untuk melengkapkan peletakan pesanan tak segerak
Gunakan baris gilir mesej untuk melengkapkan peletakan pesanan tak segerak, tingkatkan pengalaman pengguna, kemuncak dan pengurangan aliran
Idea:
1 .Sistem dimulakan dan stok kuantiti inventori produk dimuatkan ke dalam Redis.
2. Bahagian belakang menerima permintaan jualan kilat dan Redis pra-mengurangkan inventori Jika inventori telah mencapai nilai kritikal, tidak perlu meneruskan permintaan dan kegagalan akan dikembalikan secara langsung. , sejumlah besar permintaan seterusnya tidak perlu membawa sebarang masalah kepada sistem.
3 Tentukan sama ada pesanan jualan kilat telah dibuat, tentukan sama ada jualan kilat telah tiba, elakkan berbilang produk daripada satu akaun dan tentukan sama ada jualan kilat itu berulang.
4. Inventori adalah mencukupi dan tidak ada jualan kilat pendua. ke barisan. (Apa yang dikembalikan bukanlah kegagalan atau kejayaan, dan ia tidak boleh dinilai pada masa ini)
5 Selepas bahagian hadapan menerima data, ia memaparkan baris gilir dan mengundi pelayan permintaan mengikut ID produk (. pertimbangkan pengundian sekali setiap 200ms).
6. RabbitMQ bahagian belakang memantau saluran yang dinamakan MIAOSHA_QUEUE untuk jualan kilat pangkalan data dan tentukan sama ada jualan kilat diulang Kemudian Laksanakan transaksi jualan kilat (urus niaga jualan kilat ialah operasi atom: kurangkan inventori sebanyak 1, buat pesanan dan tulis pesanan jualan kilat).
7 Pada masa ini, bahagian hadapan meninjau antara muka permintaan MiaoshaResult berdasarkan ID produk untuk menyemak sama ada pesanan produk telah dijana Jika permintaan mengembalikan -1, ini bermakna jualan kilat gagal, 0 bermakna ia berada dalam baris gilir, dan >0 bermakna id produk dikembalikan Ini bermakna jualan kilat berjaya.
Pengoptimuman keselamatan
Pengesahan kata laluan berganda md5, penyembunyian alamat antara muka kilat, pengehadan semasa antara muka dan anti-leret, kod pengesahan formula matematik.
Penulisan kod yang elegan
Hasil output antara muka dijadikan pengkapsulan Hasil
Kod yang salah dijadikan pengkapsulan CodeMsg
Akses cache dibuat Pakej utama
Kesukaran projek dan penyelesaian masalah:
1 Apabila menggunakan JMeter untuk melakukan ujian tekanan, membuka 5000 utas, sistem tidak dapat dijalankan, dan pengecualian berlaku
<.> Sebab: Ubah suai item konfigurasi redis poolMaxTotal dalam fail konfigurasi dan tetapkannya kepada 1000. #redis item konfigurasiredis.poolMaxTotal=1000redis.poolMaxldle=500redis.poolMaxWait=500 .Sebilangan besar cache digunakan, jadi terdapat masalah seperti kerosakan cache, avalanche cache dan konsistensi cache? Penembusan cache merujuk kepada membuat permintaan untuk beberapa data yang pastinya tidak wujud Permintaan itu akan menembusi cache dan mencapai pangkalan data. Penyelesaian: Cache data kosong untuk data yang tidak wujud ini dan tapis permintaan tersebut. Cache avalanche merujuk kepada sejumlah besar permintaan yang sampai ke pangkalan data kerana data tidak dimuatkan ke dalam cache, atau data cache gagal (tamat tempoh) di kawasan yang besar pada masa yang sama, atau pelayan cache sedang turun. Penyelesaian:Untuk mengelakkan runtuhan cache yang disebabkan oleh tamat tempoh cache di kawasan yang luas pada masa yang sama, anda boleh memerhati tingkah laku pengguna dan menetapkan masa tamat tempoh cache dengan munasabah
Untuk mengelakkan runtuhan cache yang disebabkan oleh cache masa henti pelayan, anda boleh menggunakan Cache teragih setiap nod dalam cache yang diedarkan hanya menyimpan sebahagian daripada data Apabila nod terputus, ia boleh memastikan bahawa cache nod lain masih tersedia.
Pemanasan awal cache juga boleh dilakukan untuk mengelakkan runtuhan cache disebabkan sejumlah besar data tidak dicache sejurus selepas sistem dimulakan.
Contohnya: mula-mula tetapkan masa tamat tempoh yang berbeza untuk cache yang berbeza, seperti cache sesi Dalam awalan userKey, tetapan akan tamat tempoh dalam masa 30 minit dan masa cache dikemas kini setiap kali pengguna membalas. Setiap pemerolehan sesi akan dilanjutkan selama 30 minit, jadi kebarangkalian tamat tempoh cache adalah agak rendah
Konsistensi cache memerlukan data dikemas kini pada masa yang sama data cache juga boleh dikemas kini dalam masa nyata.
Penyelesaian:
Kemas kini cache serta-merta apabila data dikemas kini, mula-mula cuba baca dari cache, dan kembali terus selepas membaca data, baca pangkalan data dan simpan data Akan ditulis ke cache dan dikembalikan.
Sebelum membaca cache, tentukan dahulu sama ada cache adalah yang terkini Jika ia bukan yang terkini, kemas kini dahulu Apabila data perlu dikemas kini, kemas kini pangkalan data dahulu, dan kemudian batalkan (padam). data yang sepadan dalam cache.
3. Penggunaan cache yang meluas memberikan banyak tekanan pada pelayan cache.
Apabila redis pra-mengurangkan inventori, isOvermap dikekalkan dalam ingatan sebagai tanda ingatan Apabila tiada inventori, ia ditetapkan kepada benar. Sebelum setiap perniagaan jualan kilat mengakses redis, semak tanda peta Jika benar, ini bermakna tiada inventori dan ia akan mengembalikan kegagalan secara langsung tanpa meminta pelayan redis.
4. Dalam senario perniagaan dengan permintaan serentak yang tinggi, apabila sebilangan besar permintaan sudah terlambat untuk diproses, atau malah timbunan permintaan?
Baris gilir mesej, digunakan untuk memproses permintaan secara tidak segerak. Setiap kali permintaan masuk, bukannya memproses permintaan, ia dimasukkan ke dalam baris gilir mesej, dan kemudian pendengar disusun di latar belakang untuk mendengar baris gilir mesej perniagaan yang berbeza Apabila mesej datang, logik perniagaan dilaksanakan . Ini menghalang pengecualian terlalu banyak sambungan pangkalan data apabila berbilang permintaan dikendalikan pada masa yang sama.
5. Bagaimana untuk memastikan pengguna tidak boleh membuat pesanan berulang?
Penyelesaian: Buat indeks unik dalam jadual pesanan jualan kilat (rujukan ialah ID pengguna dan goodsId), supaya rekod pertama boleh dimasukkan, tetapi rekod kedua akan membuat ralat, dan kemudian gulung kembali urus niaga untuk menghalang pengguna Memproses berbilang permintaan pada masa yang sama dan menjual berbilang produk serta-merta.
Indeks unik bermaksud unik Selepas menambah indeks unik pada medan dalam struktur jadual pangkalan data, apabila pangkalan data menjalankan operasi penyimpanan, pangkalan data akan menentukan sama ada data itu sudah wujud dilakukan apabila data tidak wujud.
Walaupun ini adalah kemahiran yang kecil, ia sebenarnya merupakan kemahiran yang sangat praktikal dalam pembangunan perniagaan Contohnya, dalam perniagaan konkurensi tinggi, bagaimana pangkalan data boleh menghalang data daripada memasukkan dua nombor pesanan yang sama? Menambah indeks yang unik sudah tentu salah satu cara terpantas Sudah tentu, sama ada untuk menambah indeks atau menyelesaikannya melalui kod perniagaan bergantung kepada perniagaan syarikat
6. Bagaimana untuk menyelesaikan fenomena terlebih jual?
Senario terlebih jual: Apabila pengguna yang berbeza membaca permintaan, mereka mendapati bahawa inventori produk adalah mencukupi, dan kemudian memulakan permintaan pada masa yang sama, melakukan jualan kilat dan mengurangkan inventori, menyebabkan inventori dikurangkan kepada nombor negatif.
Kaedah paling mudah ialah mengemas kini pangkalan data untuk mengurangkan inventori dan melaksanakan sekatan inventori Dalam kaedah reduceStock(GoodsVo goodsvo), tambah satu lagi stok_kira > 0 ke sql dan gunakan ciri pangkalan data untuk memastikan terlebih jual , hanya apabila kiraan_stok lebih besar daripada 0, baca kiraan_saham dan kemudian tolak 1.
@Kemas kini("kemas kini set_barangan_miaosha_kira_saham=kira_saham-1 di mana barang_id=#{barang_barang} dan kiraan_saham>0")
public void reduceStock(MiaoshaGoods goods);
7.
Cache halaman statik HTML dalam pelayar klien Hanya data diperoleh melalui antara muka panggilan tak segerak ajax Hanya sebahagian daripada data yang berinteraksi, yang mengurangkan lebar jalur dan mempercepatkan akses pengguna.
Cache penyemak imbas adalah untuk menyimpan salinan sumber Web yang diminta (seperti halaman html, gambar, js, data, dll.) dalam penyemak imbas. Cache menyimpan salinan kandungan output berdasarkan permintaan masuk. Apabila permintaan seterusnya datang, jika ia adalah URL yang sama, cache akan memutuskan mengikut mekanisme caching sama ada untuk menggunakan salinan secara langsung untuk membalas permintaan akses, atau menghantar permintaan itu semula ke pelayan sumber. Apa yang lebih biasa ialah penyemak imbas akan cache halaman web yang telah dilawati di tapak web Apabila alamat URL dilawati semula, jika halaman web belum dikemas kini, halaman web tidak akan dimuat turun semula, tetapi secara tempatan. halaman web cache akan digunakan secara langsung. Hanya apabila tapak web mengenal pasti dengan jelas bahawa sumber telah dikemas kini, penyemak imbas akan memuat turun halaman web sekali lagi.
8. Konsep reka bentuk jualan kilat?
Pengehadan semasa: Memandangkan hanya sebilangan kecil pengguna boleh berjaya dalam pembunuhan segera, kebanyakan trafik mesti dihadkan dan hanya sejumlah kecil trafik dibenarkan memasuki bahagian belakang perkhidmatan.
Apabila menjalankan aktiviti jualan kilat, akan berlaku kemasukan segera pengguna apabila jualan tergesa-gesa bermula, mengakibatkan tempoh puncak. Oleh itu, langkah-langkah pemotongan puncak perlu diambil. Trafik puncak yang tinggi merupakan sebab penting untuk mengatasi sistem, jadi cara menukar trafik tinggi serta-merta kepada trafik yang stabil untuk satu tempoh masa juga merupakan idea penting dalam mereka bentuk sistem jualan kilat. Kaedah yang biasa digunakan untuk mencapai keratan puncak termasuk penggunaan teknologi seperti caching dan perisian tengah mesej.
Pemprosesan tak segerak: Sistem jualan kilat ialah sistem selaras tinggi Menggunakan mod pemprosesan tak segerak boleh meningkatkan jumlah penyelarasan sistem dengan ketara, pemprosesan tak segerak ialah cara untuk mencapai pemotongan puncak.
Cache memori: Kesesakan terbesar sistem jualan kilat biasanya membaca dan menulis pangkalan data Memandangkan pembacaan dan penulisan pangkalan data tergolong dalam cakera IO, prestasinya sangat rendah jika sesetengah data atau logik perniagaan boleh dipindahkan cache memori, kecekapan akan menjadi sangat tinggi.
Berskala: Sudah tentu, jika kita ingin menyokong lebih ramai pengguna dan lebih besar, adalah lebih baik untuk mereka bentuk sistem menjadi anjal dan berskala Jika trafik datang, hanya perlu mengembangkan mesin. Semasa acara Double Eleven seperti Taobao dan JD.com, sejumlah besar mesin akan ditambah untuk mengatasi kemuncak transaksi.
9. Idea reka bentuk sistem jualan kilat?
Permintaan memintas dalam huluan sistem untuk mengurangkan tekanan hiliran: sistem bunuh kilat dicirikan oleh sejumlah besar konkurensi, tetapi bilangan sebenar permintaan bunuh kilat yang berjaya adalah sangat kecil, jadi jika ia tidak dipintas di bahagian hadapan, ia berkemungkinan menyebabkan konflik kunci baca-tulis pangkalan data, dan akhirnya masa permintaan tamat.
Gunakan cache: Menggunakan cache boleh meningkatkan kelajuan membaca dan menulis sistem dengan sangat baik.
Baris gilir mesej: Baris gilir mesej boleh mengurangkan kemuncak dan memintas sejumlah besar permintaan serentak Ini juga merupakan proses pemprosesan tak segerak Perniagaan latar belakang secara aktif menarik mesej permintaan daripada baris gilir mesej untuk pemprosesan perniagaan keupayaan pemprosesan sendiri.
10. Jika inventori berkurangan dan pengguna tidak membayar, bagaimanakah inventori boleh dipulihkan dan terus mengambil bahagian dalam jualan tergesa-gesa
Tetapkan masa pembayaran maksimum, seperti 30 minit, dan terdapat tugas berjadual di latar belakang (gunakan Pemasa pemasa), putar pesanan belum selesai yang melebihi 30 minit (status pesanan ditentukan dalam pangkalan data), kemudian tutup pesanan dan pulihkan inventori.
Atas ialah kandungan terperinci Apakah mata pengetahuan projek redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!