问题描述
我正在开发一些Java后端(春季启动)的SPA。在后端连接到的关系数据库中,有一个包含一些字典值的表。值可以由应用程序的用户编辑,但实际上很少(几乎从来没有)完成。 这些字典值在UI的许多页面中都使用过,因此,我想以某种方式“缓存”它们。我想要实现的是我想在启动时加载字典值,以避免在UI和后端之间的每个请求期间向DB询问值。
首先,我考虑过在用户首次进入页面时将其加载到应用程序的UI部分。然后我排除了它,因为当其中一个用户更改值时,应该重新加载它。
我认为可能的工作是将Backend启动时将它们加载到某个集合中(可以在并发环境中安全使用,可能是ConcurrentMap),然后在一些GET请求中向该集合询问值(而不是DB)。更改值后,该请求只会更新数据库表并将其重新加载到集合中。
然后,我认为当后端扩展到多个实例时,收集解决方案是不够的。在这种情况下,将仅更新一个实例,而第二个将提供过时的数据。我们可以避免这种情况并强制每隔15分钟刷新一次(而不是在更新值时按需刷新)。 但是我认为最好的解决方案是从侧面启动一些 redis 服务,将字典值加载到其中,并且在每次数据库更新值后,只需使用新的redis实例进行更新即可。每个后端实例都将使用相同的redis实例,这似乎比在数据库上执行查询(从_中选择*,其中_ = _选择*)要快。
您怎么看?我的思维过程正确吗?您有什么想法可以解决我的问题吗?
解决方法
如果您使用的是Spring,则可以签出Spring Cache Abstraction。这样,只要发生某些更改,您的缓存就会保持最新状态。 Spring支持一些现成的实现:
Spring提供了这种抽象的一些实现:基于JDK java.util.concurrent.ConcurrentMap的缓存,Ehcache 2.x,Gemfire缓存,Caffeine和符合JSR-107的缓存(例如Ehcache 3.x)。有关插入其他缓存存储区和提供程序的更多信息,请参见插入不同的后端缓存。
如果您决定使用Memcached实现,则可以签出该库(在后台使用 Xmemcached )here。
您还可以查看一个小型演示应用程序,了解如何在项目(link)中使用Spring Cache Abstraction。
,我认为您在“缓存”方面的做法是正确的。我建议您也检查Memcached的简单性。 Redis是一个不错的选择,但是它仍然取决于您的要求以及您是否需要那么多功能。只是我的2美分
https://aws.amazon.com/elasticache/redis-vs-memcached/
https://devcenter.heroku.com/articles/spring-boot-memcache#add-caching-to-spring-boot
谢谢