一起养成写作习惯!这是我参加“一神论计划4月份经文挑战”的第25天。点击查看活动详细信息。

一、Spring Cache Abstraction

The spring framework provides support fojson数据r transparently adding caching to an application . at its core,The abstraction applies caspring面试

Sspring面试题pring高速缓存抽象是一组高速缓存规范,通过定义org . springframeworkjson . cache . cache和CacheManager的两个接口集成了不同的高速缓存技术

高速缓存接口mybatis面试题提供高速缓存组件的规范定义,并包含缓慢JSON内存的各种操作集合

高速缓存接数据结构教程第5版李春葆答案口下的弹簧提供了多种xxxCache实现数据结构c语言版本(RedisCache、EhCjson格式怎么打开acheCache、Concurre缓存视频变成本地视频ntMapCache等)

Cach缓存是什么意思eManager是管理各种缓存组件的缓存管理器

CacheManager和Cache的关系类似于数据库连接池和数据库连springmvc的工作原理接。

为了简化开发,Spring高速缓存抽象同时支持Jacache的注释,Jacache也是一组规范。

JCache定义了五个核心接口:

CachingProvjsonider:定义多个CacheManagerjson解析的创建、配置、导入、管理和控制,在运行过程中可以访问多个caching提springmvc的工作原理供程序

CaCaiderManager:创建、配置、导入、管理和控制存在于Cachemanager的j数据结构c语言版严蔚敏第二版答案sonp上下文中的多个唯一命名的ca高速缓存是指che。CacheManager只能MyBatis属于一mybatis框架个Cachismybatis一级缓存和二级缓存pringngProvjson

Cache:暂时储存类似快取的Map数目jsonp资料结构、金钥索引值。缓存只能属于一个CacheManager

数据结构题库目:高速缓存

的Key-数据结构有哪些Value对
  • Expiry:每一个存储spring面试题在Ca缓存文件夹名称che中的条目有一个mybatis注解定义的有效期,一旦超过这个事件,条目为过期状态且无法访问、更新和删除,缓存有数据结构知识点总结效期可以通过ExpiryPolicy设置
  • 为了简化开发,更多是使Spring用Spring的缓存抽象,Spring的缓存抽mybatis中$和井号区别象的底数据结构教程第5版李春葆答案层概念与JSR107是一致的

    Spring 缓存抽象中的重要注解

    • @Cacheable:根据方缓存清理法的请求参数对结果进行缓存
    • @CacheEvict:清空缓存
    • @CachePut:保证方法被调用,同时缓存结果缓存
    • @EnableCachispspringcloudring是什么意思ng:开springcloud启基于注解的缓存

    每次调用需要缓存功能的方法时,Spring会检查数据结构严蔚敏指定参数的执springmvc的工作原理行目标方法是否已经被调用过,如果有就直接从数据结构题库spring翻译缓存中获取方法调用后的结果,如果没数据结构严蔚敏有就调用目标方法并缓存结果json怎么读后返回给用户,下次再次调用的时候直接从缓存中获取

    You can a数据结构c语言版第二版课后答案lso use the standard缓存视频合并 JSR-107 (JCache) annotations (such aJSONs @CacheResult) transparently. However, we strongly advise you to not mix and match the Spring Cache and JCache annotations.

    Sprisjsonppring框架ng Boot 官方建议spring框架不要混用 Spring Cache 和mybatisplus JCache 的注解

    工程搭建与测试

    创建spring bomybatis中$和井号区别ot工程smybatisplusprimybatis怎么读ng-boot-cache

    根据S缓存的视频在哪QL文件新建tesla、json格式怎么打开factory两数据结构有哪些张表

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    -- ----------------------------
    -- Table structure for factory
    -- ----------------------------
    DROP TABLE IF EXISTS `factory`;
    CREATE TABLE `factory` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `factory_name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1166057542 DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of factory
    -- ----------------------------
    BEGIN;
    INSERT INTO `factory` VALUES (1, '上海特斯拉超级工厂');
    INSERT INTO `factory` VALUES (2, '加州弗拉蒙特特斯拉超级工厂');
    INSERT INTO `factory` VALUES (3, '得克萨斯州特斯拉超级工厂');
    INSERT INTO `factory` VALUES (4, '柏林特斯拉超级工厂');
    COMMIT;
    SET FOREIGN_KEY_CHECKS = 1;
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    -- ----------------------------
    -- Table structure for tesla
    -- ----------------------------
    DROP TABLE IF EXISTS `tesla`;
    CREATE TABLE `tesla` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `price` double(10,2) DEFAULT NULL,
      `vehicle_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
      `factory_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1166057542 DEFAULT CHARSET=utf8;
    -- ----------------------------
    -- Records of tesla
    -- ----------------------------
    BEGIN;
    INSERT INTO `tesla` VALUES (1166057520, 'Model 3P 2021', 280000.00, '四门轿车', 1);
    COMMIT;
    SET FOREIGN_KEY_CHECKS = 1;
    

    entity包下增加Tesla和Factory实体类

    @Data
    public class Tesla {
        private Integer id;
        private String name;
        private Double price;
        private String vehicleType;
        private Integer factoryId;
    }
    
    @Data
    public class Factory {
        private Integer id;
        private String factoryName;
    }
    

    application.ym数据结构c语言版第二版课后答案l中配置druid

    spring:
      datasource:
        # driver可以不写,会根据连接自动判断
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
        url: jdbc:mysql://localhost:3306/test
        druid:
          # 初始化大小,最小,最大
          initial-size: 5
          max-active: 100
          min-idle: 1
          # 配置获取连接等待超时的时间
          max-wait: 60000
          # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
          time-between-eviction-runs-millis: 60000
          # 配置一个连接在池中最小生存时间
          min-evictable-idle-time-millis: 300000
          # 用来检测连接是否有效的sql 必须是一个查询语句 注意没有此语句以下三个属性不会生效
          validation-query: SELECT 1 FROM DUAL
          # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
          test-on-return: false
          # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
          test-on-borrow: true
          # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
          test-while-idle: true
          # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
          filters: stat,wall
          # 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录
          connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
          # 配置 DruidStatFilter
          web-stat-filter:
            enabled: true
            url-pattern: /*
            exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
          # 配置 DruidStatViewServlet
          stat-view-servlet:
            url-pattern: /druid/*
            # IP 白名单,没有配置或者为空,则允许所有访问
            #allow: 127.0.0.1
            # IP 黑名单,若白名单也存在,则优先使用
            #deny: 192.168.31.253
            # 禁用 HTML 中 Reset All 按钮
            reset-enable: true
            # 登录用户名/密码
            login-username: root
            login-password: 123
            # 注意 此处必须开启,否则无法访问druid监控面板
            enabled: true
          use-global-data-source-stat: true
    logging:
      level:
        # 输出mapper接口中方法执行的SQL语句
        com.lilith.mapper: debug
    mybatis:
      # 全局配置文件的位置
      config-location: classpath:mybatis-config.xml
      mapper-locations: classpath:mappers/*.xml
        # configuration:
      # map-underscore-to-camel-case: true
    debug: true
    

    在mymybatisplusbatis-config.mybatis分页插件实现原理xml缓存视频合并app中配置MyBatis全局配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        <typeAliases>
            <package name="com.lilith.entity"/>
        </typeAliases>
    </configuration>
    

    mapper包下增加TeslaMapper和FactspringoryMapper两个接口,实现增删改查方法

    public interface TeslaMapper {
        void insert(Tesla tesla);
        Tesla selectOneById(Integer id);
        void update(Tesla tesla);
        void deleteOneById(Integer id);
    }
    
    public interface FactoryMapper {
        Factory selectOneById(Integer id);
        void deleteOneById(Integer id);
        void insert(Factory factory);
        void update(Factory factory);
    }
    

    resourcmybatispluses目录下m数据结构教程第5版李春葆答案appers文件夹中的Mapper XML映射文件TeslaMap数据结构题库per.xml和FactoryMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lilith.mapper.TeslaMapper">
        <sql id="Base_Columns_List">
            id, name, price, vehicle_type, factory_id
        </sql>
        <select id="selectOneById" resultType="tesla">
            select <include refid="Base_Columns_List" /> from tesla where id = #{id}
        </select>
        <insert id="insert">
            INSERT INTO tesla (name, price, vehicle_type, factory_id)
            VALUES (#{name}, #{price}, #{vehicleType},#{factoryId})
        </insert>
        <update id="update">
            UPDATE tesla SET name = #{name}, price = #{price}, vehicle_type = #{vehicleType}, factory_id = #{factoryId}
            WHERE id = #{id}
        </update>
        <delete id="deleteOneById">
            DELETE FROM tesla WHERE id=#{id}
        </delete>
    </mapper>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.lilith.mapper.FactoryMapper">
        <sql id="Base_Columns_List">
            id, factory_name
        </sql>
        <select id="selectOneById" resultType="factory">
            SELECT <include refid="Base_Columns_List" /> FROM factory WHERE id = #{id}
        </select>
        <delete id="deleteOneById">
            DELETE FROM factory WHERE id=#{id}
        </delete>
        <insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
            INSERT INTO factory (factory_name)
            VALUES (#{factoryName})
        </insert>
        <update id="update">
            UPDATE factory SET factory_name = #{factoryName} where id = #{id}
        </update>
    </mapper>
    

    初始化spring-boot-cache工程的步骤:

    1. 创建tesla和factory两张表
    2. spri数据结构c语言版ng-boot-cache中entity包下创建TJSONespring框架sla和Factory实体类
    3. 整合Druid数据源
    4. 配置MyBatis
    5. 新建TeslaMapp数据结构mybatis一级缓存和二级缓存c语言版第二版课后答案er、Factory数据结构Mapper并增加增删改查方法
    6. 测试TeslaMapper、FactoryMapper的增删改缓存查方法

    数据结构知识点总结配置完成数据访问层并测试成功之后,新建service包并在该目录下新增impl包,在springservice包中新增TeslaService接口并在impl包中新增TeslaService的实现类TeslaServiceIMyBatismpl

    public interface TeslaService {
        Tesla getTeslaById(Integer id);
    }
    
    @Service
    @Slf4j
    public class TeslaServiceImpl implements TeslaService {
        @Autowired
        private TeslaMapper teslaMapper;
        @Override
        public Tesla getTeslaById(Integer id) {
            log.info("查询" + id + "特斯拉");
            return teslaMapper.selectOneById(id);
        }
    }
    

    新增controller包,spring增加TeslaController类,返回JSON格式数据

    @RestController
    public class TeslaController {
        @Autowired
        private TeslaService teslaService;
        @GetMapping("/tesla/{id}")
        public Tesla find(@PathVariable("id") Integer id){
            Tesla teslaById = teslaService.getTeslaById(id);
            return teslaById;
        }
    }
    

    启动应用,测试Controller缓存类,不要忘了数据结构c语言版在主程序类上添加@MapperSc缓存是什么意思a数据结构c语缓存是什么意思言版第二版课后答案n扫描所有的Mapper接口

    Spring Cache 的使用

    首先在主程序类上使用@EnableCachimybatis中$和井号区别ng来开启基于注解的缓存

    @Cacheable

    mybatis注解在TeslaServiceImpl类上的getTeslaBspring翻译yI缓存英文d()方法未添加@Cacheable注解之前,每一次查询都会调用数据库执行SQL语句,@Cacheable注解可以将方法运行的结果缓存,以后查询结果相同的spring翻译数据直接缓存中获取,不会在调数据结构实验报告用方法

    增加@Cacheable注解后,添加ca缓存清理cheNames属性,重启应用,多次查询只会执行一次SQL语句

    @Cacheable的几mybatis分页插件实现原理个属性

    • cacheNames/valu数据结构实验报告e:指spring定缓存组件的名字
    • keymybatis动态sql:缓存数据用的Key,可以用来来指定具体的缓存内容,默认使用的是方法的参数值,也可以通过缓存视频合并SpELjsonobject指定spring漏洞,如”#id”既获取方法的参数id,”#result”为方法执行json数据的结果
    • keyGenerator:Key的生成器,可以自己指定Key的生成器组件id,key/keyGeneratospring翻译r二选一使用
    • ca缓存的视频在哪cheManager:指定缓存管理器,或者Cachspring翻译eResolver指定获取解析器
    • condition:指定符合条件的情况下才会缓存方法的执行结果,如果condition=”#id>0″
    • unless:否定缓存,当unle缓存ss的条件为true时,方法的返回值不json格式会被缓mybatis怎么读存,如unless=”缓存视频变成本地视频#result==null”既当结果返回为nmybatiMyBatiss分页插spring框架件实现原理ulmybatis怎么读l时不缓存
    • sync:是否使用异步模式

    缓存SpELl表达式

    名称 位置 描述 缓存视频怎样转入相册
    methodNammybatis怎么读e root object 当前被调用的方法名 #root.met数据结构有哪些hodName
    method root object 当前被调用的方法 #root.method.name
    target root object 当前被调缓存视频变成本地视频用的目标对象 #root.taspringrget
    targespring翻译tClass root object 当前被调用的目标对象类 #root.targetClasspring框架s
    args rootmybatis框架 objejson数据ct 当前被调用的参数列表 #root.args[0]
    cachesspring是什么意思 root object 当前方法调用使用的缓存列表数据结构c语言版,@Cacheable(value={“cache1”, “cache2”}) #root.caches.name[0]
    argumMyBatisent name evaluation context 方法参数的名字,可以直接 “缓存的视频在spring漏洞#参数名”, 也可以使用”#p0″或者”#a0″, 0代表索引 #p0
    result evaluation context 方法执行后的返回值,仅当该结果会被缓存时才可使用 #result