分布式session的一种处理方式是集中存储和管理,通常可以采用缓存(redis等),考虑单点问题可以考虑双写备份。
在分布式应用中,如何保证session的并发处理是分布式session的重要问题之一。
这里我们分析一种解决方案:
1. 存储工具
ThreadLocal<T>,它是一个辅助存储的工具。
ThreadLocal中的基本存储结构是ThreadLocalMap,其中的基础对象为:WeakReference<T>
WeakReference(弱引用)指当需要某个指向某对象的引用,但又不影响此对象的垃圾收集,应该使用此对象代替一般的 reference。即,这个对象在除了WeakReference以外没有其他引用指向时,可以被垃圾回收,此时弱引用会变为null值。
ThreadLocalMap使用和普通Map相同的方式,只是每个元素都是WeakReference的子类。保证线程回收时,对象能够被垃圾回收。
ThreadLocal中的ThreadLocalMap是被注入存储到Thread中的。ThreadLocalMap的key是ThreadLocal本身(属性进行某种运算得到),而value是不同的ThreadLocal对应的set方法设置的值。每个Thread只会有一个ThreadLocalMap。需要注意的就是,ThreadLocal不是一个存储结构,也不会包含存储结构。所以ThreadLocal可以理解为一个帮助线程存储数据的工具类。
2. 存储
存储可以选取k-v存储方案,利用框架自身工具获取唯一ID为Key,存储相应数据即可。