Seperti tajuknya, terdapat sistem log masuk, tetapi projek lama tidak mempunyai cache (saya tidak mempunyai hak untuk menambahnya), tetapi perkhidmatan yang berbeza perlu menggunakan data dari permintaan http sebelumnya (dibezakan oleh pengguna) , dan saya ingin menyimpannya untuk mengelakkan menghantar http berulang kali setiap kali.
Backend springmvc
Buat masa ini saya boleh fikirkan 3 kaedah:
1. Buangnya ke dalam sesi (HttpSessionListener), ia sepatutnya menjadi yang paling mudah, tetapi saya tidak tahu masalah yang mungkin berlaku
2 Buangnya ke dalam threadlocal (pengawal membuat pembolehubah threadlocal statik, atau menulis pemegang konteks)
3. . Pengawal menjadikan ahli ConcurrentHashMap, Masukkan data mengikut <ID Pengguna, data yang diperolehi oleh permintaan http> Tetapi ini pastinya tidak boleh dilaksanakan dan boleh menyebabkan kawasan timbunan OOF
Mari kita bercakap tentang kemungkinan masalah dengan pilihan kedua.
1. Terdapat kemungkinan masalah kebocoran memori yang disebut di Internet, yang menyebabkan OOF dalam PermGen Teks asal disambungkan kepada analisis kes kebocoran memori ThreadLocal
2. Adakah rentetan data dalam utas permintaan akan muncul? benang permintaan Semasa menyajikan A, saya mendapat data B. .
Kaedah 1 adalah yang paling mudah dan paling biasa digunakan Jika bilangan pengguna terlalu besar, atau pengimbangan beban dilakukan, adalah perlu untuk melaksanakan storan berpusat Sesi Terdapat banyak penyelesaian siap yang boleh menyokong storan berpusat HttpSession , termasuk Redis, MongoDB dan MySQL Terdapat kesemuanya, cari di GitHub.
Kaedah 2 tidak menyelesaikan masalah, terutamanya kerana selepas pengguna log masuk, berbilang permintaan mungkin jatuh ke dalam berbilang benang. Perkara kedua yang anda sebutkan juga adalah alasan.
Kaedah 3 juga merupakan kaedah pelaksanaan Malah, HttpSession Tomcat dilaksanakan menggunakan ConcurrentHashMap (hanya ia menggunakan sessionId dan bukannya userId sebagai kunci), tetapi satu perkara yang perlu diambil perhatian ialah anda mesti mengurus sendiri setiap Nilai-Kekunci dalam Peta. Kitaran hayat, sebagai contoh, jika Sesi tamat, ia mesti dialih keluar tepat pada masanya.