最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Cache框架應用介紹

 更新時間:2022年09月14日 17:13:50   作者:杼蛘  
我們一定聽說過"緩存無敵"的話,特別是在大型互聯(lián)網(wǎng)公司,"查多寫少"的場景屢見不鮮。Spring Cache是作用在方法上的,其核心思想是,當我們在調(diào)用一個緩存方法時會把該方法參數(shù)和返回結果作為一個鍵值對存在緩存中

介紹

Spring Cache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能。

Spring Cache提供了一層抽象,底層可以切換不同的cache實現(xiàn)。具體就是通過CacheManager接口來統(tǒng)一不同的緩存技術。

CacheManager是Spring提供的各種緩存技術抽象接口。

針對不同的緩存技術需要實現(xiàn)不同的CacheManager:

CacheManager描述
EhCacheCacheManager使用EhCache作為緩存技術
GuavaCacheManager使用Google的GuavaCache作為緩存技術
RedisCacheManager使用Redis作為緩存技術

常用注解

注解說明
@EnableCaching開啟緩存注解功能
@Cacheable在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中
@CachePut將方法的返回值放到緩存中
@CacheEvict將一條或多條數(shù)據(jù)從緩存中刪除

在Spring Boot項目中,使用緩存技術只需在項目中導入相關緩存技術的依賴包,并在啟動類上使用@EnableCaching開啟緩存支持即可。

例如,使用Redis作為緩存技術,只需要導入spring-boot-starter-data-redis的Maven坐標即可。

實際測試

使用Spring Cache(默認緩存ConcurrentMapCacheManager

創(chuàng)建Spring Boot項目,使用MybatisX插件生成對應的mapper、service、實體類等,導入相關依賴,修改配置文件,創(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:
    #應用的名稱,可選
    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)存,重啟服務會清空緩存數(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:
    #應用的名稱,可選
    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 #設置緩存過期時間(單位:秒),可選
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條件起作用)

到此這篇關于Spring Cache框架應用介紹的文章就介紹到這了,更多相關Spring Cache框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring中的JdbcTemplate詳細解析

    Spring中的JdbcTemplate詳細解析

    這篇文章主要介紹了Spring中的JdbcTemplate詳細解析,JdbcTemplate是Spring框架中提供的一個對象,是對原始繁瑣的Jdbc API對象的簡單封裝,Spring框架為我們提供了很多的操作模板類,需要的朋友可以參考下
    2024-01-01
  • Java中操作數(shù)組的Arrays類

    Java中操作數(shù)組的Arrays類

    大家好,本篇文章主要講的是Java中操作數(shù)組的Arrays類,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • IntelliJ IDEA使用SVN分支的簡單介紹

    IntelliJ IDEA使用SVN分支的簡單介紹

    今天小編就為大家分享一篇關于IntelliJ IDEA使用SVN分支的簡單介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java解析調(diào)用webservice服務的返回XML串詳解

    Java解析調(diào)用webservice服務的返回XML串詳解

    這篇文章主要介紹了Java解析調(diào)用webservice服務的返回XML串詳解的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 解決在微服務環(huán)境下遠程調(diào)用feign和異步線程存在請求數(shù)據(jù)丟失問題

    解決在微服務環(huán)境下遠程調(diào)用feign和異步線程存在請求數(shù)據(jù)丟失問題

    這篇文章主要介紹了解決在微服務環(huán)境下遠程調(diào)用feign和異步線程存在請求數(shù)據(jù)丟失問題,主要包括無異步線程得情況下feign遠程調(diào)用,異步情況下丟失上下文問題,需要的朋友可以參考下
    2022-05-05
  • Springboot SseEmitter流式輸出的實現(xiàn)代碼

    Springboot SseEmitter流式輸出的實現(xiàn)代碼

    本文介紹了Spring Boot中使用SseEmitter實現(xiàn)流式輸出的原理和示例代碼,通過SseEmitter,可以實現(xiàn)客戶端和服務器之間的實時通信,服務器可以分塊發(fā)送數(shù)據(jù),而客戶端可以實時接收和處理這些數(shù)據(jù),,感興趣的朋友一起看看吧
    2025-03-03
  • 使用SpringMVC在redirect重定向的時候攜帶參數(shù)的問題

    使用SpringMVC在redirect重定向的時候攜帶參數(shù)的問題

    這篇文章主要介紹了使用SpringMVC在redirect重定向的時候攜帶參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中的轉義字符介紹

    java中的轉義字符介紹

    普通的轉義字符序列和八進制轉義字符都比Unicode轉義字符要好得多,因為與Unicode轉義字符不同,轉義字符序列是在程序被解析為各種符號之后被處理的
    2013-09-09
  • Spring?WebFlux怎么進行異常處理源碼解析

    Spring?WebFlux怎么進行異常處理源碼解析

    這篇文章主要為大家介紹了Spring?WebFlux怎么進行異常處理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • SpringBoot中解決跨域的多種實現(xiàn)方式

    SpringBoot中解決跨域的多種實現(xiàn)方式

    這篇文章主要介紹了SpringBoot中解決跨域的多種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論

钦州市| 余江县| 茌平县| 柳林县| 班玛县| 崇文区| 太白县| 南雄市| 泸水县| 宜川县| 绥江县| 札达县| 阿拉尔市| 金山区| 顺平县| 冀州市| 于田县| 苍溪县| 焦作市| 哈密市| 莆田市| 灵寿县| 长泰县| 华池县| 密山市| 乌兰察布市| 德令哈市| 东莞市| 庄河市| 门源| 南澳县| 东安县| 大兴区| 盐津县| 百色市| 汤原县| 达拉特旗| 梨树县| 大英县| 拜泉县| 崇礼县|