• 在Spring Boot中使用进程内缓存和Cache注解


    在Spring Boot中使用内缓存的时候需要预先知道什么是内缓存,使用内缓存的好处。

    什么是内缓存

    内缓存(也称为进程内缓存或本地缓存)是指将数据存储在应用程序的内存中,以便在需要时快速访问和检索数据,而无需每次都从外部数据源(如数据库或网络)获取数据。

    内缓存通常用于提高应用程序的性能和响应速度,因为内存访问比磁盘或网络访问更快。通过将经常使用的数据存储在内存中,应用程序可以避免频繁地访问慢速的外部数据源,从而提高数据访问的效率。

    内缓存可以用于各种场景,例如:

    • 数据库查询结果缓存:将数据库查询的结果存储在内存中,以便在相同的查询被再次执行时,可以直接从缓存中获取结果,而无需再次查询数据库。
    • API响应缓存:将API的响应结果存储在内存中,以便在相同的API请求被再次发起时,可以直接从缓存中获取响应结果,而无需再次调用外部API。
    • 计算结果缓存:将复杂的计算结果存储在内存中,以便在相同的计算被再次触发时,可以直接从缓存中获取结果,而无需重新执行计算逻辑。

    内缓存可以使用各种缓存框架或库来实现,如Caffeine、EhCache、Redis等。这些缓存框架提供了方便的API和配置选项,使开发人员能够轻松地在应用程序中使用内缓存。

    需要注意的是,内缓存是存储在应用程序的内存中的,因此它的容量是有限的。过多地使用内缓存可能会导致内存占用过高,从而影响应用程序的性能。因此,在使用内缓存时,需要根据实际需求和可用内存来进行合理的配置和管理。

    案例:

    引入相关依赖:

    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-webartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-data-jpaartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-cacheartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-actuatorartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>mysqlgroupId>
    			<artifactId>mysql-connector-javaartifactId>
    		dependency>
    
    		<dependency>
    			<groupId>org.projectlombokgroupId>
    			<artifactId>lombokartifactId>
    			<scope>providedscope>
    		dependency>
    
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-testartifactId>
    			<scope>testscope>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在配置文件中引入数据库相关属性:

    spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=create-drop
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    创建实体类对象,其中数据库对象和实体类对象一一对应,这里就不给出数据库SQL语句了:

    @Entity
    //@Data
    //@NoArgsConstructor
    public class User {
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String name;
        private Integer age;
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public User() {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    User实体的数据访问实现:

    @CacheConfig(cacheNames = "users")
    public interface UserRepository extends JpaRepository<User, Long> {
    
        @Cacheable
        User findByName(String name);
    
        User findByNameAndAge(String name, Integer age);
    
        @Query("from User u where u.name=:name")
        User findUser(@Param("name") String name);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    创建一个测试类:

    @Slf4j
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    
        @Autowired
        private UserRepository userRepository;
    
        @Autowired
        private CacheManager cacheManager;
    
        @Test
        public void test() throws Exception {
            // 创建1条记录
            userRepository.save(new User("AAA", 10));
    
            User u1 = userRepository.findByName("AAA");
            System.out.println("第一次查询:" + u1.getAge());
    
            User u2 = userRepository.findByName("AAA");
            System.out.println("第二次查询:" + u2.getAge());
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    需要在启动类中加入@EnableCaching注解:

    @EnableCaching
    @SpringBootApplication
    public class Application {
    
    	public static void main(String[] args) {
    		SpringApplication.run(Application.class, args);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    如图,我们可以看到在调用第二次的findByName的时候,并没有执行select语句,这样也就减少了对数据库的读取操作。

    在这里插入图片描述

    在这里插入图片描述
    通过图片可以看到,在第一次调用findByName函数之后,CacheManager将这个查询结果保存下来,在第二次访问的时候,就可以匹配上而不需要再次访问数据库了。

    @Cacheable:该注解用于标记方法的返回值应该被缓存。当调用带有@Cacheable注解的方法时,Spring Boot会首先检查缓存中是否存在对应的结果。如果存在,则直接返回缓存的结果;如果不存在,则执行方法体中的逻辑,并将结果存储到缓存中。该注解可以指定缓存的名称、缓存的键等参数。

    @CachePut:该注解用于标记方法的返回值应该被更新到缓存中。与@Cacheable不同,@CachePut注解会每次都执行方法体中的逻辑,并将结果存储到缓存中。它通常用于更新缓存中的数据,以确保缓存的数据与实际数据保持同步。

    @CacheEvict:该注解用于标记方法的返回值应该从缓存中移除。当调用带有@CacheEvict注解的方法时,Spring Boot会从缓存中移除对应的结果。该注解可以指定要移除的缓存名称、缓存的键等参数。它通常用于在数据发生变化时,清除缓存中的旧数据。

    @Caching:该注解用于将多个缓存相关的注解组合在一起使用。通过@Caching注解,您可以在一个方法上同时使用多个缓存相关的注解,以实现更复杂的缓存操作。

    关于更多的Cache配置,我们可以参照Spring Boot官方文档

  • 相关阅读:
    网络安全在2024好入行吗?
    CentOS 搭建本地 yum 源方式 安装 httpd 服务
    Ubuntu18.04 realsenseD435i深度摄像头外参标定的问题
    循环神经网络 - 语言模型和数据集
    Pytest系列-YAML格式测试用例(8)
    传统架构应用快速横向扩容PK容器!
    [swift刷题模板] 树状数组(BIT/FenwickTree)
    Git上传代码
    物联网LORA技术-SX1276/SX1277/SX1278-137MHz至1020MHz低功耗远距离收发器
    MySQL高级篇之存储引擎分类
  • 原文地址:https://blog.csdn.net/qq_45922256/article/details/134384392