Spring Cache 抽象允许您轻松缓存方法的结果,但是对于集合 AFAIC,它只是缓存集合结果,当许多用户共享集合中的元素时,这并不总是有效的。
我正在寻找的是创建通读缓存的好方法。我正在寻找一些如何最好地做到这一点的建议。
在这种情况下,我正在检索来自不同用户的帖子(想象一下 FB 墙)。这些帖子具有每个用户共同的方面:标题、描述、海报照片等。但也有一些对用户来说是个人的东西:“你和你的 3 个朋友喜欢这个。”
我的服务层基本上有这样的方法
public List<Post> getPosts(User user, int start, int max){
//get the ids
List<Long> ids = dao.getPostIds(user, start, max);
//get the associated posts
List<Post> posts = dao.getPosts(ids);
//personalize result
return convert(posts, user);
}
Post 对象是 Hibernate 管理的 Post Entity 的派生对象。我一直觉得获取整个 Hibernate 托管实体及其所有惰性集合和有时不需要的初始化并不是大容量读取的理想选择,因此我将这些实体的值投影到一个简单的 Post bean。如果有人对此有任何想法,那也会很有趣。
PostIds 是随着新帖子的出现而经常更新的东西。帖子本身可以在用户之间共享,因为您会看到一些与您的朋友相同的帖子。转化对于最终用户来说是独一无二的。
所以,我希望缓存能够支持这一点。一个短暂的 id 缓存和一个 LFU 后缓存。这或多或少是二级 Hibernate 缓存的工作方式,但除非有人能说服我,否则就不行了。此外,我想在链的上层使用它,这样我们就可以缓存对象,而不仅仅是在每个请求上都必须与对象水合的值数组。
因此,LFU 缓存必须能够查看是否有任何 id-posts 在其缓存中,并在单独的 getPosts(ids) 中从数据库中检索丢失的任何项目,将它们放入缓存中,然后整个事情返回一个结果。
有没有一种不需要发明很多轮子的好方法?大多数(如果不是全部)文档似乎都集中在缓存方法的整个结果上,而没有描述如何实现这种更细粒度的通读方法。
任何建议表示赞赏。
亲切的问候,马克