您好,登錄后才能下訂單哦!
今天小編給大家分享一下Spring Cache使用技巧有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Spring Cache是一個框架,實現了基于注解的緩存功能,只需要簡單地加一個注解,就能實現緩存功能。
Spring Cache提供了一層抽象,底層可以切換不同的cache實現。具體就是通過CacheManager接口來統一不同的緩存技術。
CacheManager是Spring提供的各種緩存技術抽象接口
針對不同的緩存技術需要實現不同的CacheManager:
CacheManager默認使用的ConcurrentMapManager
Spring Cache 常用注解
在spring boot項目中,使用緩存技術只需在項目中導入相關緩存技術的依賴包,并在啟動類上使用@EnableCaching開啟緩存支持即可。
例如,使用Redis作為緩存技術,只需要導入Spring data Redis的maven坐標即可。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
spring cache的基本api在web下的context包中
如果有使用其他的api可以導入cache的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
創建cache_demo數據庫,并創建user表
> create database cache_demo; Query OK, 1 row affected (0.02 sec) > use cache_demo; Database changed > create table user ( > id bigint primary key, > name varchar(50), > age int, > address varchar(50) >);
改POM
<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </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>
寫YML
server: port: 8080 spring: application: #應用的名稱,可選 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: root mybatis-plus: configuration: #在映射實體或者屬性時,將數據庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: ASSIGN_ID
User
@Data public class User implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String name; private int age; private String address; } UserMapper ==================================================== @Mapper public interface UserMapper extends BaseMapper<User>{ } UserController ==================================================== @RestController @RequestMapping("/user") @Slf4j public class UserController { @Autowired private UserService userService; // 增加User @PostMapping public User save(User user){ userService.save(user); return user; } // 刪除User @DeleteMapping("/{id}") public void delete(@PathVariable Long id){ userService.removeById(id); } // 更新User @PutMapping public User update(User user){ userService.updateById(user); return user; } // 根據id查詢User @GetMapping("/{id}") public User getById(@PathVariable Long id){ User user = userService.getById(id); return user; } // 根據id和name查詢User集合 @GetMapping("/list") public List<User> list(User user){ LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(user.getId() != null,User::getId,user.getId()); queryWrapper.eq(user.getName() != null,User::getName,user.getName()); List<User> list = userService.list(queryWrapper); return list; } }
主啟動類
@Slf4j @SpringBootApplication public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class,args); log.info("項目啟動成功..."); } }
啟動類上加注解@EnableCaching // 使用spring cache
// 在controller中加入緩存對象 @Autowired private CacheManager cacheManager; /** * CachePut:將方法返回值放入緩存 * value:緩存的名稱,每個緩存名稱下面可以有多個key * key:緩存的key */ @CachePut(value = "userCache",key = "#user.id") @PostMapping public User save(User user){ userService.save(user); return user; }
通過ctrl點進key下載源碼后我們可以看到這里使用的是SpEL語言動態獲取值
測試,使用 postman 發請求
第一次添加會將返回的user存放進cacheManager中
在方法執行前spring先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;若沒有數據,調用方法并將方法返回值放到緩存中
/** * Cacheable:在方法執行前spring先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;若沒有數據,調用方法并將方法返回值放到緩存中 * value:緩存的名稱,每個緩存名稱下面可以有多個key * key:緩存的key * condition:條件,滿足條件時才緩存數據 * unless:滿足條件則不緩存 */ @Cacheable(value = "userCache",key = "#id",unless = "#result == null") @GetMapping("/{id}") public User getById(@PathVariable Long id){ User user = userService.getById(id); return user; }
測試,我們使用jack的id去查詢一下,同樣使用postman,在這個方法設置斷點,如果沒有觸發斷點說明是在cache中查詢直接返回的
/** * 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; }
導入redis依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
修改YML
server: port: 8080 spring: application: #應用的名稱,可選 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: 192.168.23.100 port: 6379 password: zjy123...000 database: 1 cache: redis: time-to-live: 1800000 #設置緩存過期時間,可選 mybatis-plus: configuration: #在映射實體或者屬性時,將數據庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: ASSIGN_ID
啟動項目后,cache變成了RedisCacheManager
使用postman發送save請求
db01
發送DELETE刪除緩存
以上就是“Spring Cache使用技巧有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。