如何在SpringBoot中清除所有缓存 ?


缓存提高了性能,但也引入了一致性问题。这就是为什么在我的 Spring Boot 应用程序中启用缓存后,我意识到提供一个程序来按需清除所有缓存是多么重要。
登录到您的服务器以手动释放 您的应用程序的所有缓存数据应该是最后一个绝望的选择。因此,我开始寻找方法来为管理员提供一种在需要时清除所有缓存的可靠且安全的方法。幸运的是,这可以通过几行代码轻松实现。
让我们看看如何定义一个自定义 API,旨在清除 Spring Boot 应用程序的缓存。
 
构建 API
假设您的应用程序已经使用了缓存引擎,并使用了Spring Cache 模块。一切都被认为是正确配置的。
为了处理缓存,Spring在启动时内部创建了一个CacheManager bean。尽管 Spring 不提供按需清除所有缓存的功能,但您可以通过利用此缓存管理器来实现这一点。
事实上,它的getCacheNames()方法返回您的管理器中已知的缓存名称的集合。通过迭代它们,您可以检索当前正在处理的每个Cache实例,并clear()在每个实例上调用该方法。
通过这种简单的方法,您可以定义一种安全的方法来清除 Spring Boot 应用程序中使用的所有缓存。这就是为什么设计一个 API 来实现这样的目标并不复杂,可以实现如下:

@RestController
@RequestMapping("/caches")
public class CachingController {
    @Autowired
    private CacheManager cacheManager;

    @DeleteMapping(
"clear")
    public ResponseEntity<Void> clearAllCaches() {
        cacheManager
                .getCacheNames()
                .stream()
                .forEach(cacheName -> cacheManager.getCache(cacheName).clear());
    }
}

您只需要自动连接已实现的CacheManager bean 并遵循上述方法。通过将这个逻辑封装在一个公开的端点中,您实际上是在定义一个触发器,只要调用 API 就可以激活它。
请注意,只有在插入第一个条目时才会初始化缓存。这意味着在CacheManager缓存任何数据之前,您不会看到任何可用的缓存。