假设我有一个授权会话存储实现为Cache<String, Session>
,其中Cache
是Guava缓存或类似的东西,而Session
是一些带有会话数据的类似地图的对象。假设密钥是在初始身份验证期间生成的一些sessionId
字符串。缓存本身具有一些到期策略,因此,例如,在30m的不活动之后,会话被驱逐并且具有两个参数的回调,缓存键和缓存值最终被调用以进行完全清理
现在假设我想将基本相同用户的不同登录选项映射到同一sessionId
。例如,可以使用相同的登录凭据进行后续请求,该凭据应解析为已经存在的会话,或者可以放置链接到同一用户的API请求,或者浏览器可以使用其中的会话ID来请求数据cookie - 所有这些都应该解析为相同的会话和会话ID。
实现此目标的一种策略是从原始Map<String, String>
标头(或其某些散列)维护authorization
到sessionId
,然后转到原始缓存。这个可以是一个简单的映射,其缺失值与会话高速缓存中存在值但不存在对应会话的情况相同。当调用会话缓存到期回调时,我最终可以清理匹配相同sessionId的所有条目。这个解决方案很容易实现,但有点难看。
对我来说,另一个非常更具吸引力的策略是实际使用原始authorization
标题(或其中的一些散列)以及sessionId
作为关键字对于指向完全相同会话的会话高速缓存(因此多个键,至少两个,指向相同的会话值)。添加数据是微不足道的,但驱逐是棘手的,因为必须立即驱逐同一会话(值)的所有键值对,并且必须仅调用一次回调(因为应该执行一些终结逻辑)对于会议,但只有一次)。
对支持此类功能的现有缓存库的任何建议或任何想法如何在例如番石榴缓存或任何类似的缓存解决方案?