SpringCache入门

发布时间:2023年12月18日

1. SpringCache概述

Spring Cache 是 Spring 框架提供的一个用于提高应用性能的缓存抽象。它不是一个具体的缓存实现,而是提供了一组一致的编程模型来整合各种缓存机制,比如 EhCache、Caffeine、Redis 等。Spring Cache 使得开发者可以通过简单的注解来实现缓存的应用,而无需关心底层的缓存实现细节。

主要特性

  1. 抽象和透明的缓存操作:Spring Cache 提供了一个高度抽象的缓存操作层,允许开发者通过注解的方式进行缓存操作,无需直接与底层缓存提供者交互。

  2. 声明式缓存:支持通过注解(如 @Cacheable@CachePut@CacheEvict)声明方法的缓存行为。

  3. 灵活的缓存配置:可以灵活地配置缓存的各种属性,如过期时间、缓存大小等。

  4. 支持多种缓存库:与多种流行的缓存库整合,如 EhCache、Guava Cache、Caffeine、Redis等。

关键注解

  1. @Cacheable:在方法执行前,Spring 先查看缓存中是否存在之前执行过的结果,如果有则直接返回缓存数据,不再执行方法;如果没有,则执行方法并将结果存入缓存。

  2. @CachePut:无论如何都会执行方法,并将执行结果放入指定的缓存中。

  3. @CacheEvict:用于从缓存中移除相应的数据。

  4. @Caching:可以组合多个缓存操作。

  5. @CacheConfig:类级别的注解,用于共享缓存的名称、KeyGenerator、CacheManager等配置。

使用示例

@Service
public class MyService {

    @Cacheable(value = "users", key = "#id")
    public User getUserById(String id) {
        // 方法实现,比如从数据库获取用户信息
    }

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        // 更新用户信息并返回
        return user;
    }

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(String id) {
        // 删除用户操作
    }
}

在此示例中,getUserById 方法被 @Cacheable 注解,这意味着其结果会被缓存,并且后续的同参数调用会直接使用缓存数据。updateUserdeleteUser 方法分别用 @CachePut@CacheEvict 注解,用于更新和移除缓存。

总结

Spring Cache 提供了一个简单而强大的缓存抽象,它使得在Spring应用中实现缓存变得容易且不依赖于具体的缓存实现,有助于提高应用性能,减少对外部系统(如数据库)的访问压力。

2. SpringCache使用完整案例

使用Spring Cache和Redis实现用户信息的缓存,我们需要进行以下步骤:

1. 添加依赖

首先,在Spring Boot项目中添加Spring Cache和Redis的依赖。对于Maven项目,在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置Redis

application.propertiesapplication.yml文件中配置Redis连接。例如:

spring.redis.host=localhost
spring.redis.port=6379

如果你使用Redis服务器的默认设置,那么通常只需要配置Redis服务器的地址和端口。

3. 启用缓存

在Spring Boot的主类上使用@EnableCaching注解来启用缓存支持:

@SpringBootApplication
@EnableCaching
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4. 创建模型和服务

定义一个User模型和一个用户服务,例如:

public class User {
    private String id;
    private String name;
    // 省略getter和setter方法
}

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id")
    public User getUserById(String id) {
        // 模拟从数据库或其他服务中获取用户信息
        System.out.println("Retrieving from the database: " + id);
        return new User(id, "User" + id);
    }
}

使用@Cacheable注解,当调用getUserById方法时,Spring首先检查缓存users中是否有对应的条目。如果没有,它将执行方法,并将返回的结果存储在缓存中。

5. 创建控制器

创建一个控制器来处理Web请求:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable String id) {
        return userService.getUserById(id);
    }
}

当客户端请求/user/{id}路由时,控制器将调用UserService来获取用户信息。

总结

在这个例子中,我们配置了Spring Boot应用来使用Redis作为缓存提供者。通过UserServicegetUserById方法,我们可以从缓存中检索用户信息,如果缓存中没有该用户的信息,就从数据库或其他数据源中获取,并将结果存储在缓存中。这样,对于相同的用户ID的后续请求,可以直接从Redis缓存中获取数据,从而减少对后端数据源的访问,提高应用性能。

文章来源:https://blog.csdn.net/m0_54187478/article/details/134980525
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。