在我的应用程序中,我使用了Spring、Hibernate和EHCache。问题是数据库正在被另一个应用程序修改。有没有可能,有没有实现的解决方案来根据一些数据库更改来刷新缓存?我可以使用一些额外的列进行版本控制等。有什么主意吗?
k75qkfdt1#
您正在寻找的是众所周知的Read-Write Through缓存。EhCache支持它。摘自EhCache文档:直写缓存是一种缓存模式,其中对缓存的写入会导致对基础资源的写入。缓存充当底层资源的门面。对于这种模式,通常也可以通过缓存进行读取。写后缓存使用相同的客户端API;但是,写操作是异步进行的。Ehcache-2.0引入了直写和写后缓存。虽然文件系统或Web服务客户端可以作为直写缓存的底层,但最常见的底层资源是数据库。以下是一篇详细的文章:http://www.ehcache.org/documentation/2.8/apis/write-through-caching.html#write-through-and-write-behind-caching-with-the-cachewriter-
Read-Write Through
toiithl62#
Ehcache不支持这种开箱即用的方案。直写是指更改以相反的方式流动:您的应用程序更新缓存,而缓存在后台将更新推送到数据库。为了将数据库更新推送到您的应用程序,您必须提出您自己的解决方案。理想的方法是不让两个不同的应用程序访问相同的数据,而是让两个应用程序中的一个通过另一个,这样一个应用程序就可以拥有这组数据。
w80xi6nr3#
下面的解决方案用于在每次数据库保存后刷新缓存
@CacheEvict(cacheNames = {"my-cache"}, allEntries = true) public MyObject save(MyObject object) { MyObject myObject = myRepo.save(object); CompletableFuture.runAsync(() -> config.loadData()); return myObject; }
3条答案
按热度按时间k75qkfdt1#
您正在寻找的是众所周知的
Read-Write Through
缓存。EhCache支持它。摘自EhCache文档:
直写缓存是一种缓存模式,其中对缓存的写入会导致对基础资源的写入。缓存充当底层资源的门面。对于这种模式,通常也可以通过缓存进行读取。写后缓存使用相同的客户端API;但是,写操作是异步进行的。Ehcache-2.0引入了直写和写后缓存。虽然文件系统或Web服务客户端可以作为直写缓存的底层,但最常见的底层资源是数据库。
以下是一篇详细的文章:http://www.ehcache.org/documentation/2.8/apis/write-through-caching.html#write-through-and-write-behind-caching-with-the-cachewriter-
toiithl62#
Ehcache不支持这种开箱即用的方案。直写是指更改以相反的方式流动:您的应用程序更新缓存,而缓存在后台将更新推送到数据库。
为了将数据库更新推送到您的应用程序,您必须提出您自己的解决方案。理想的方法是不让两个不同的应用程序访问相同的数据,而是让两个应用程序中的一个通过另一个,这样一个应用程序就可以拥有这组数据。
w80xi6nr3#
下面的解决方案用于在每次数据库保存后刷新缓存