广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCache框架应用介绍
  • 510
分享到

SpringCache框架应用介绍

2024-04-02 19:04:59 510人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍常用注解实际测试介绍 spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache提供了一层抽象,底层可

介绍

spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。

CacheManager是Spring提供的各种缓存技术抽象接口。

针对不同的缓存技术需要实现不同的CacheManager:

CacheManager描述
EhCacheCacheManager使用EhCache作为缓存技术
GuavaCacheManager使用Google的GuavaCache作为缓存技术
RedisCacheManager使用Redis作为缓存技术

常用注解

注解说明
@EnableCaching开启缓存注解功能
@Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

Spring Boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。

例如,使用Redis作为缓存技术,只需要导入spring-boot-starter-data-redis的Maven坐标即可。

实际测试

使用Spring Cache(默认缓存ConcurrentMapCacheManager

创建Spring Boot项目,使用mybatisX插件生成对应的mapper、service、实体类等,导入相关依赖,修改配置文件,创建数据库

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:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID

数据库SQL如下:


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("项目启动成功...");
    }
}

创建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 = "userCache", key = "#user.id")
    @PostMapping
    public User save(User user) {
        userService.save(user);
        return user;
    }
    
    @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(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进行接口测试

打断点调试,发送请求,可以看到已存入缓存

该缓存底层基于Map实现,默认ConcurrentHashMap基于内存,重启服务会清空缓存数据

使用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:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID

启动项目,再次请求接口

启动redis命令行窗口,查看

当请求不存在的id时,不会执行缓存操作(@Cacheable注解的unless条件起作用)

到此这篇关于Spring Cache框架应用介绍的文章就介绍到这了,更多相关Spring Cache框架内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringCache框架应用介绍

本文链接: https://www.lsjlt.com/news/167559.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringCache框架应用介绍
    目录介绍常用注解实际测试介绍 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache提供了一层抽象,底层可...
    99+
    2022-11-13
  • Clouda框架介绍与应用场景
    Clouda是一个基于浏览器运行的前端应用开发框架。它提供了一套完整的开发工具和资源,可以帮助开发者快速构建跨平台的Web应用。Cl...
    99+
    2023-08-23
    Clouda
  • Node.js开源应用框架HapiJS介绍
    一、HapiJS介绍 HapiJS是一个开源的、基于Node.js的应用框架,它适用于构建应用程序和服务,其设计目标是让开发者把精力集中于开发可重用的应用程序的业务逻辑,向开发者提供构建应用程序业务逻辑所需...
    99+
    2022-06-04
    开源 框架 Node
  • SpringCloudAlibaba框架介绍
    目录前言1.集成Nacos实现服务的自动注册与发现2. Feign负载均衡注:OpenFeign和Feign的区别:3.使用Sentinel实现了接口的限流4.Feign整合Sent...
    99+
    2023-05-15
    SpringCloud Alibaba框架介绍 SpringCloud Alibaba框架 SpringCloud Alibaba
  • PythonFlask框架使用介绍
    目录1. 数据库连接池2. wtfroms3. 信号3.1 内置信号3.2 使用信号3.3 自定义信号4. 多app应用5. flask-script5.1 快速使用5.2 自定制命...
    99+
    2022-11-11
  • django-1-框架介绍
    <<<python虚拟环境>>> 用django框架做web开发必须要用到python虚拟环境,而且一个虚拟环境只能创建一个django项目,如果创建多个django项目的画将会出现一些莫名奇妙的异常 ...
    99+
    2023-01-30
    框架 django
  • Pythonflask框架定时任务apscheduler应用介绍
    目录基本使用trigger启动方式cron启动方式使用装饰器定时启动任务flask-apscheduler将apscheduler移植到了flask应用中,使得在flask中可以非常...
    99+
    2022-11-11
  • SpringBoot框架详细介绍
    目录 1.SpringBoot简介 2. 搭建springboot工程 3. 了解pom.xml以及配置文件 4. springboot的配置文件种类 5. java读取springboot配置文件的内容。 第一种: @Value读取 第二...
    99+
    2023-10-08
    spring boot java spring
  • WPF框架之Prism介绍
    什么是Prism? Prism是一个用于在 WPF、Xamarin Form、Uno 平台和 WinUI 中构建松散耦合、可维护和可测试的 XAML 应用程序框架。 Prism历史 ...
    99+
    2022-11-13
  • python web框架的介绍
    随着互联网的兴起,web开发变得愈发的重要。Python作为当前火热的语言, 其中的web开发框架可以说是百花齐放,下面聊一聊这些框架。 一: 基于Python的代表性Web框架 Django Django是一个开放源代码的Web应用...
    99+
    2023-01-30
    框架 python web
  • C++之openFrameworks框架介绍
    目录0x00 openFrameworks 介绍0x01 开启 oF 之旅0x02 oF 文件结构0x03 图形基础0x04 使用 ...
    99+
    2023-05-19
    C++ openFrameworks框架 C++框架 C++ openFrameworks
  • pytorch框架的详细介绍与应用详解
    目录pytorch框架的详细介绍与应用一.pytorch概述1.pytorch概念2.pytorch与tensorflow的区别3.pytorch包含的内容二.pytorch常用模块...
    99+
    2023-05-15
    pytorch框架介绍 pytorch框架应用
  • scrapy框架的简单介绍
    这篇文章主要介绍“scrapy框架的简单介绍”,在日常操作中,相信很多人在scrapy框架的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”scrapy框架的简单介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • Python测试框架pytest介绍
    目录一、Pytest简介二、Pytest安装三、Pytest测试执行四、测试类主函数五、断言方法六、常用命令详解七、接口调用一、Pytest简介 Pytest is a mature...
    99+
    2022-11-13
  • Java框架入门之简单介绍SpringBoot框架
    前言 Spring都包含了哪些部分呢? 主要包含Spring Boot、Spring Framework、Spring Data、Spring Cloud、Spring Cloud ...
    99+
    2022-11-12
  • Java shiro安全框架使用介绍
    目录1.shiro安全框架1.1 什么是权限管理1.2 什么是身份认证1.3 什么是授权1.4 认证授权框架有哪些2.使用shiro完成认证工作2.1 shiro中认证的关键对象2....
    99+
    2022-11-13
  • Micronaut框架的简单使用介绍
    目录什么是Micronaut主要特点入门依赖注入构建HTTP服务器阻塞HTTP反应式IO构建HTTP客户端声明性HTTP客户端编程HTTP客户端Micronaut客户端联合项目特征现...
    99+
    2022-11-12
  • WPF框架Prism中ViewInjection用法介绍
    View View通常指的是, 我们定义的页面, 而在模块化的系统当中, 我们往往称之为用户控件(UserControl)。对于模块化系统而言, 每个模块当中都有N个用户控件组成, ...
    99+
    2022-11-13
  • WPF框架Prism中ViewModelLocator用法介绍
    建立连接 在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示: 建立连接的方式 如果你使用了解WPF当中如何绑定D...
    99+
    2022-11-13
  • .NET日志框架Nlog使用介绍
    目录快速安装快速配置快速使用详解配置添加支持Console输出输出至CSV文件配置日志大小配置日志分级配置生成规则日志过滤器条件语言条件函数NLog是一个基于.NET平台编写的类库,...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作