简介
- Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
- Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:
- EHCache
- Caffeine
- Redis
Spring Cache 常用注解
实现过程
- demo的目录结构
- 在pom.xml文件中导入Spring Cache和Redis相关maven坐标
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.3</version> <relativePath/> </parent> <groupId>com.itheima</groupId> <artifactId>springcache-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <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> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.3</version> </plugin> </plugins> </build> </project>
- 在启动类CacheDemoApplication上加入@EnableCaching注解,开启缓存注解功能
@Slf4j @SpringBootApplication @EnableCaching //开启缓存注解功能 public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class,args); log.info("项目启动成功..."); } }
- WebMvcConfiguration代码
@Configuration @Slf4j public class WebMvcConfiguration extends WebMvcConfigurationSupport { /** * 生成接口文档配置 * @return */ @Bean public Docket docket(){ log.info("准备生成接口文档..."); ApiInfo apiInfo = new ApiInfoBuilder() .title("接口文档") .version("2.0") .description("接口文档") .build(); Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) .select() //指定生成接口需要扫描的包 .apis(RequestHandlerSelectors.basePackage("com.itheima.controller")) .paths(PathSelectors.any()) .build(); return docket; } /** * 设置静态资源映射 * @param registry */ protected void addResourceHandlers(ResourceHandlerRegistry registry) { log.info("开始设置静态资源映射..."); registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
- UserController代码
@RestController @RequestMapping("/user") @Slf4j public class UserController { @Autowired private UserMapper userMapper; @PostMapping @CachePut(cacheNames = "userCache" ,key = "#user.id") //使用Spring Cache 缓存数据,key的生成:userCache::user.id public User save(@RequestBody User user){ userMapper.insert(user); return user; } @DeleteMapping @CacheEvict(cacheNames = "userCache" ,key = "#id") //删除单个缓存 public void deleteById(Long id){ userMapper.deleteById(id); } @DeleteMapping("/delAll") @CacheEvict(cacheNames = "userCache" , allEntries = true) //删除全部缓存 public void deleteAll(){ userMapper.deleteAll(); } @GetMapping @Cacheable(cacheNames = "userCache",key = "#id") //key的生成:userCache::id public User getById(Long id){ User user = userMapper.getById(id); return user; } }
- User代码
@Data public class User implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String name; private int age; }
- UserMapper代码
@Mapper public interface UserMapper{ @Insert("insert into user(name,age) values (#{name},#{age})") @Options(useGeneratedKeys = true,keyProperty = "id") void insert(User user); @Delete("delete from user where id = #{id}") void deleteById(Long id); @Delete("delete from user") void deleteAll(); @Select("select * from user where id = #{id}") User getById(Long id); }
- application.yml配置
server: port: 9999 spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/spring_cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: **** password: **** redis: host: localhost port: 6379 database: 2 //可选择自己想用的 logging: level: com: wang: mapper: debug service: info controller: info
- sql代码
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `age` int DEFAULT NULL, PRIMARY KEY (`id`) );