您好,登錄后才能下訂單哦!
這篇文章主要介紹了Spring Cache框架怎么應(yīng)用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Spring Cache框架怎么應(yīng)用文章都會有所收獲,下面我們一起來看看吧。
Spring Cache
是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能。
Spring Cache提供了一層抽象,底層可以切換不同的cache實現(xiàn)。具體就是通過CacheManager
接口來統(tǒng)一不同的緩存技術(shù)。
CacheManager是Spring提供的各種緩存技術(shù)抽象接口。
針對不同的緩存技術(shù)需要實現(xiàn)不同的CacheManager:
CacheManager | 描述 |
---|---|
EhCacheCacheManager | 使用EhCache作為緩存技術(shù) |
GuavaCacheManager | 使用Google的GuavaCache作為緩存技術(shù) |
RedisCacheManager | 使用Redis作為緩存技術(shù) |
注解 | 說明 |
---|---|
@EnableCaching | 開啟緩存注解功能 |
@Cacheable | 在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中 |
@CachePut | 將方法的返回值放到緩存中 |
@CacheEvict | 將一條或多條數(shù)據(jù)從緩存中刪除 |
在Spring Boot項目中,使用緩存技術(shù)只需在項目中導入相關(guān)緩存技術(shù)的依賴包,并在啟動類上使用@EnableCaching開啟緩存支持即可。
例如,使用Redis作為緩存技術(shù),只需要導入spring-boot-starter-data-redis的Maven坐標即可。
使用Spring Cache(默認緩存ConcurrentMapCacheManager
)
創(chuàng)建Spring Boot項目,使用MybatisX插件生成對應(yīng)的mapper、service、實體類等,導入相關(guān)依賴,修改配置文件,創(chuàng)建數(shù)據(jù)庫
pom.xml如下:
<?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.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.itheima</groupId> <artifactId>cache_demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </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>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.23</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.5</version> </plugin> </plugins> </build> </project>
application.yml如下:
server:
port: 8080
spring:
application:
#應(yīng)用的名稱,可選
name: cache_demo
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
mybatis-plus:
configuration:
#在映射實體或者屬性時,將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
數(shù)據(jù)庫SQL如下:
/* Navicat Premium Data Transfer Source Server : Aiw Source Server Type : MySQL Source Server Version : 50528 Source Host : localhost:3306 Source Schema : cache_demo Target Server Type : MySQL Target Server Version : 50528 File Encoding : 65001 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `age` int(11) NULL DEFAULT NULL, `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1568896554487369729, 'Aiw', 22, '湖北省'); SET FOREIGN_KEY_CHECKS = 1;
在啟動類上添加@EnableCaching
注解
package com.itheima; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @Slf4j @SpringBootApplication @EnableCaching // 開啟緩存注解功能 public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class,args); log.info("項目啟動成功..."); } }
創(chuàng)建UserController
package com.itheima.controller; import com.itheima.entity.User; import com.itheima.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; @RestController @RequestMapping("/user") @Slf4j public class UserController { @Autowired private CacheManager cacheManager; @Autowired private UserService userService; /** * CachePut:將方法返回值放入緩存 * value:緩存的名稱,每個緩存名稱下面可以有多個key * key:緩存的key */ @CachePut(value = "userCache", key = "#user.id") @PostMapping public User save(User user) { userService.save(user); return user; } /** * CacheEvict:清理指定緩存 * value:緩存的名稱,每個緩存名稱下面可以有多個key * key:緩存的key */ @CacheEvict(value = "userCache", key = "#p0") //@CacheEvict(value = "userCache",key = "#root.args[0]") //@CacheEvict(value = "userCache",key = "#id") @DeleteMapping("/{id}") public void delete(@PathVariable Long id) { userService.removeById(id); } //@CacheEvict(value = "userCache",key = "#p0.id") //@CacheEvict(value = "userCache",key = "#user.id") //@CacheEvict(value = "userCache",key = "#root.args[0].id") @CacheEvict(value = "userCache", key = "#result.id") @PutMapping public User update(User user) { userService.updateById(user); return user; } /** * Cacheable:在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中 * value:緩存的名稱,每個緩存名稱下面可以有多個key * key:緩存的key * condition:條件,滿足條件時才緩存數(shù)據(jù) * unless:滿足條件則不緩存 */ @Cacheable(value = "userCache", key = "#id", unless = "#result == null") @GetMapping("/{id}") public User getById(@PathVariable Long id) { return userService.getById(id); } @Cacheable(value = "userCache", key = "#user.id + '_' + #user.name") @GetMapping("/list") public List<User> list(User user) { return userService.lambdaQuery() .eq(Objects.nonNull(user.getId()), User::getId, user.getId()) .eq(Objects.nonNull(user.getName()), User::getName, user.getName()) .list(); } }
以上不同寫法均等價
使用ApiPost進行接口測試
打斷點調(diào)試,發(fā)送請求,可以看到已存入緩存
該緩存底層基于Map實現(xiàn),默認ConcurrentHashMap基于內(nèi)存,重啟服務(wù)會清空緩存數(shù)據(jù)
使用Spring Cache(redis緩存RedisCacheManager
)
導入Maven坐標
<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>
修改配置文件
server:
port: 8080
spring:
application:
#應(yīng)用的名稱,可選
name: cache_demo
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: localhost
port: 6379
# password: root@123456
database: 0
cache:
redis:
time-to-live: 1800000 #設(shè)置緩存過期時間(單位:秒),可選
mybatis-plus:
configuration:
#在映射實體或者屬性時,將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
啟動項目,再次請求接口
啟動redis命令行窗口,查看
當請求不存在的id時,不會執(zhí)行緩存操作(@Cacheable注解的unless條件起作用)
關(guān)于“Spring Cache框架怎么應(yīng)用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Spring Cache框架怎么應(yīng)用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。