Java中需要每个请求的缓存功能

Java中需要每个请求的缓存功能,java,spring,caching,Java,Spring,Caching,我正在使用JavaSpring框架开发RESTAPI 在调用这些API时,我需要检查权限,其中我需要调用DB以获取权限数据。问题是,在一个请求中有多个区域检查权限,我不想对DB进行多次调用,因此我打算仅为该请求缓存权限数据 我尝试过创建一个请求范围的bean,这是可行的,但并非适用于所有情况。有时无法创建请求范围的bean,例如在使用@scheduled注释运行调度代码时,仅仅因为它不是请求。另一种情况是,当使用WebSecurityConfigureAdapter检查权限时,此时还没有创建be

我正在使用JavaSpring框架开发RESTAPI

在调用这些API时,我需要检查权限,其中我需要调用DB以获取权限数据。问题是,在一个请求中有多个区域检查权限,我不想对DB进行多次调用,因此我打算仅为该请求缓存权限数据

我尝试过创建一个请求范围的bean,这是可行的,但并非适用于所有情况。有时无法创建请求范围的bean,例如在使用@scheduled注释运行调度代码时,仅仅因为它不是请求。另一种情况是,当使用WebSecurityConfigureAdapter检查权限时,此时还没有创建bean

因此,我研究了另一种可能的解决方案,这是:。如果使用此解决方案,则每次操作完成时都需要从threadLocal中删除缓存。我不太习惯使用这个解决方案,因为我不是Java方面的专家,而且我读到不建议使用threadLocal作为缓存

实现我的目标最好的方法是什么?我的请求很简单,只为该请求缓存一些数据。有支持它的图书馆吗


我发现很难相信我的ask不是一个正常的用例,或者它不是一个正常的用例?

在这种情况下,您可以使用
ThreadLocal
作为缓存。不需要澄清。根据文件

只要线程处于活动状态且{@code ThreadLocal}实例可访问,每个线程都持有对其线程局部变量副本的隐式引用;线程消失后,其线程本地实例的所有副本都将接受垃圾收集(除非存在对这些副本的其他引用)


例如:
ThreadLocal-THREAD\u-LOCAL\u DATA=ThreadLocal.withInitial(HashMap::new)

如何使用缓存服务,如redis、memcached?“我发现很难相信我的ask不是一个正常的用例,或者它不是一个正常的用例?”请避免此类评论。在我看来,这是一个常见而简单的编程问题,您显然对此感到沮丧。这与任何框架或数据库技术无关。ThreadLocal确实是可能的答案之一。@MateuszStefek如果该评论冒犯了您,我深表歉意。我并不沮丧。我只是想找到最好的解决办法。正如你所说,这是一个简单而常见的问题,但我找不到一个直接的答案。ThreadLocal是一个可能的解决方案,但它有风险吗?看看Maheshkumar提出的答案,他建议我可以使用ThreadLocal,caisil评论说内存泄漏可能会发生。在SpringCache中,我们可以设置缓存的TTL,我只是希望有一个配置,告诉缓存在每次请求后过期。使用普通的缓存库,如Guava或cache2k,并将TTL设置在5分钟到1小时之间。对于权限,如果在撤销之前需要一点时间,通常是可以的。如果这是一个问题,您可以为权限撤销添加REST API,以将其从缓存中删除。对于使用线程池的webservice,线程是长期存在的。如果不显式删除,将导致内存泄漏。因此,我想如果必须使用ThreadLocal方法,则必须在每次操作后清除缓存?@DhinneshJeevan,ThreadLocal数据将在线程完成后自动进行垃圾收集。无需手动删除。