springboot 中spring cache,重启程序缓存数据不丢失

springboot 集成 spring cache

img


使用的是最简单的形式写的,未使用缓存管理器
往缓存中读写正常,疑问是如果数据是存在内存中的,为什么重启程序数据不丢失

你使用什么缓存管理器呢?redis?配置文件中找找看是采用的什么缓存,如果是在redis上或者其他中间件缓存中,那重启项目就不会丢失

你没有引入 EhCache 或者redis之类的么?

  • 你看下这篇博客吧, 应该有用👉 :springboot中Cache缓存的使用
  • 除此之外, 这篇博客: springboot默认缓存实现Spring Cache注解的使用中的 选择默认缓存器中间件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •        springboot集成redis,配置redis为默认缓存器

  • 以下回答由chatgpt基于相关博客总结生成:

    由于数据存储在内存中,重启程序后数据仍然存在的原因是Spring Cache的工作原理。Spring Cache使用缓存注解来标注需要进行缓存的方法,在方法执行时,会先检查缓存中是否存在相应的数据。如果存在,则直接从缓存中获取数据并返回;如果不存在,则执行方法,并将方法返回的数据存入缓存中供下次使用。

    具体的解决方案如下:

    1. 使用Spring Boot创建一个Spring Boot项目,并引入Spring Cache相关的依赖(如spring-boot-starter-cache)。

    2. 定义一个缓存配置类,使用@EnableCaching注解启用缓存功能,并使用@Configuration注解将类声明为一个配置类。在配置类中,可以使用@CacheConfig注解来统一配置缓存的公共属性(如缓存的名称、缓存的过期时间等)。

    @Configuration
    @EnableCaching
    public class CacheConfig {
        // 可以在这里配置缓存的公共属性
    }
    
    1. 在需要进行缓存的方法上使用缓存注解(如@Cacheable、@CachePut、@CacheEvict等)来标注方法,以指定需要缓存的方法及其相关配置。
    @Cacheable("users") // 缓存名称为"users"
    public User findById(Integer id) {
        System.out.println("find user by id: " + id);
        User user = new User();
        user.setId(id);
        user.setName("Name" + id);
        return user;
    }
    
    1. 在应用程序启动类上添加@EnableCaching注解,以启用缓存功能。
    @SpringBootApplication
    @EnableCaching
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
    1. 运行应用程序,并调用需要进行缓存的方法。第一次调用方法时,会执行方法体,并将方法返回的数据存入缓存中。第二次及以后调用方法时,会直接从缓存中获取数据并返回。

    2. 在重启程序后,仍然可以从缓存中获取之前存入的数据,因为数据仍然存在于内存中。

    需要注意的是,Spring Cache并没有提供数据持久化的功能,只是将数据缓存在内存中。如果需要在重启程序时仍然保持数据的完整性,可以考虑使用其他数据持久化的方式,如数据库存储或文件存储。

可以看一下默认的缓存依赖是什么

spring boot项目有个特点,就是在你引入依赖后,会使用默认配置。如果你的项目里引入了redis或EhCache依赖,那么就会使用默认配置。不管使用哪个框架,内容都会持久化到磁盘中,只是持久化的时机不同 。