Wie der Titel schon sagt, gibt es ein Anmeldesystem, aber das alte Projekt hat keinen Cache (ich habe nicht das Recht, es hinzuzufügen), sondern verschiedene Dienste müssen die Daten früherer http-Anfragen verwenden (vom Benutzer unterschieden). , und ich möchte es speichern, um zu vermeiden, dass jedes Mal http-Anfragen Ressourcen verschwenden.
Backend springmvc
Aktuell fallen mir 3 Methoden ein:
1. Werfen Sie es in die Sitzung (HttpSessionListener), es sollte am einfachsten sein, aber ich kenne die möglichen Probleme nicht
2. Werfen Sie es in den Threadlocal (Controller erstellt eine statische Threadlocal-Variable oder schreibt einen Kontexthalter)
3 . Der Controller wird Mitglied von ConcurrentHashMap. Geben Sie die Daten entsprechend der <Benutzer-ID ein, Daten, die per HTTP-Anfrage erhalten wurden. Dies ist jedoch definitiv nicht machbar und kann zu einem Ausfall des Heap-Bereichs führen
1. Im Internet wird ein mögliches Speicherleckproblem erwähnt, das OOF in PermGen verursacht. Der Originaltext steht im Zusammenhang mit der ThreadLocal-Speicherleckfallanalyse
2. Wird die Datenzeichenfolge im Anforderungsthread angezeigt? Ein Anforderungsthread bedient beispielsweise die Anforderungen von zwei Benutzern (A und B), indem er seine eigenen Daten in den Anforderungsthread einfügt Anfragethread Beim Servieren von A habe ich die Daten von B erhalten. .
方法1是最简单、最常用的,如果用户量太大,或者做了负载均衡,就要实现集中存储的Session,有很多现成的方案可以支持集中存储的HttpSession的,存Redis、MongoDB、MySQL的都有,GitHub上搜一下。
方法2不解决问题,主要是因为用户登录后,多次请求可能会落在多个线程里。你说的第二点也是理由。
方法3也是一种实现方式,其实Tomcat的HttpSession就是用ConcurrentHashMap实现的(只是它用sessionId而不是用userId做key),但要注意的一点是,你必须自己管理Map中每个Key-Value的生命周期,例如Session超时了要及时remove掉。