タイトルにあるように、ログイン システムはありますが、古いプロジェクトにはキャッシュがありません (キャッシュを追加する権限がありません)。ただし、別のサービスは以前の http リクエストのデータを使用する必要があります ( user) を毎回重複しないように保存したいのですが、http リクエストを送信するとリソースが無駄になります。
背景 springmvc
現在、3つの方法を考えています:
1. セッション (HttpSessionListener) 内にスローします。これが最も簡単なはずですが、潜在的な問題がわかりません。
2. スレッドローカル内にスローします (コントローラーは静的なスレッドローカル変数を作成するか、 contextholder)
3.controller ConcurrentHashMap のメンバーを作成し、そこに「ユーザー ID、http リクエストで取得したデータ」に従ってデータを入れますが、これは絶対に不可能で、ヒープ領域で OOF が発生する可能性があります
2 番目のオプションで考えられる問題について話しましょう。
1. インターネット上でメモリ リークの問題の可能性が指摘されており、PermGen で OOF が発生します。元のテキストは ThreadLocal メモリ リークの例の分析に関連付けられています。
2. リクエスト スレッドのデータ文字列は表示されますか? たとえば、リクエスト スレッドは 2 人のユーザー (A と B) のリクエストを同時に処理します。B はリクエスト スレッドに独自のデータを置き、A のデータをカバーします。スレッドサービスAをリクエストしたところ、Bのデータが取得されました。 。
方法1是最简单、最常用的,如果用户量太大,或者做了负载均衡,就要实现集中存储的Session,有很多现成的方案可以支持集中存储的HttpSession的,存Redis、MongoDB、MySQL的都有,GitHub上搜一下。
方法2不解决问题,主要是因为用户登录后,多次请求可能会落在多个线程里。你说的第二点也是理由。
方法3也是一种实现方式,其实Tomcat的HttpSession就是用ConcurrentHashMap实现的(只是它用sessionId而不是用userId做key),但要注意的一点是,你必须自己管理Map中每个Key-Value的生命周期,例如Session超时了要及时remove掉。