SpringBoot学习笔记-9:第九章 Spring Boot 与缓存(1)

简介: SpringBoot学习笔记-9:第九章 Spring Boot 与缓存

第九章 Spring Boot 与缓存

主要内容

JSR-107
Spring 缓存抽象
整合 Redis

1、JSR-107

Java Caching 定义了 5 个核心接口

CachingProvider:管理多个CacheManager
CacheManager:管理多个Cache
Cache:类似Map数据结构
Entry:存储在Cache中的key-value对
Expiry: 有效期
Application
    - CachingProvider
        - CacheManager
            - Cache
                Entry <-> Expiry

Spring 缓存抽象简介

重要概念


Cache 缓存接口,实现 RedisCache、EhCacheCache、ConcurrentMapCache

CacheManager 缓存管理器

@Cacheable 根据方法请求参数,对结果进行缓存

@CacheEvict 清空缓存

@CachePut 保证方法被调用,又希望结果被缓存

@EnableCaching 开启基于注解的缓存

keyGenerator 缓存数据时 key 的生成策略

serialize 缓存数据时 value 序列化策略


1、搭建环境

引入 Spring 依赖


Cache

Web

MySQL

MyBatis



导入数据库文件,创建出 employee 和 department 表

创建 javabean 封装数据

整合 MyBatis 操作数据库

配置数据源信息

使用注解版 MyBatis

@MapperScan 指定需要扫描的 Mapper 接口所在包

2、使用缓存


开启基于注解的缓存 @EnableCaching

标注缓存注解 @Cacheable

@Cacheable

SpEL


methodName 方法名

method 方法

target 目标对象

targetClass 目标对象类

args 参数列表

caches 缓存列表

argumentname 参数名

result 返回值



参数


value 缓存组件名

key 缓存使用的key, 默认使用方法参数值

keyGenerator 指定key的生成器,和key二选一

cacheManager 缓存管理器

cacheResolver 缓存解析器 和缓存管理器二选一

condition 缓存条件 eg: #id>0

unless 否定缓存 条件为true不缓存

sync 使用同步




缓存工作原理

自动配置类

CacheAutoConfiguration


GenericCacheConfiguration"

JCacheCacheConfiguration"

EhCacheCacheConfiguration"

HazelcastCacheConfiguration"

InfinispanCacheConfiguration"

CouchbaseCacheConfiguration"

RedisCacheConfiguration"

CaffeineCacheConfiguration"

SimpleCacheConfiguration"

NoOpCacheConfiguration"



默认使用 SimpleCacheConfiguration


cacheManager:ConcurrentMapCacheManager


运行流程:


执行方法之前,先按照 cacheNames 获取 Cache 缓存组件,暗

第一次获取缓存如果没有 cache 组件就创建

按照某种策略生成 key,查抄内容

没有查找到缓存就调用目标方法

目标方法换回的结果放进缓存中

SimpleKeyGenerator 默认策略


如果没有参数 key = new SimpleKey()

如果有一个参数 key = 参数值

如果有多个参数 key - new SimpleKey(params)

核心:


获取 CacheManger(默认 ConcurrentMapCacheManager)

使用 KeyGenerator 生成 key 默认 SimpleKeyGenerator

自定义 key 的生成方式

package com.example.demo.config;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
import java.util.Arrays;
@Configuration
public class MyCacheConfig {
    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){
            @Override
            public Object generate(Object target, Method method, Object... params) {
                System.out.println("generate");
                return method.getName() + "[" + Arrays.asList(params).toString()+ "]";
            }
        };
    }
}
// keyGenerator和key二选一
// key 支持SpEL表达式
@Cacheable(value = "department", key = "#id")
public Department getById(Integer id){
    return departmentMapper.getById(id);
}
// keyGenerator
@Cacheable(value = "department", keyGenerator = "myKeyGenerator")
public Department getById(Integer id){
    return departmentMapper.getById(id);
}

@CachePut

@CachePut 既调用方法,又更新缓存数据

修改了数据库的某个数据,同时更新缓存

运行时机:先调用目标方法,再将方法的结果缓存

@CachePut(value = "department", key="#department.id")
public Department update(Department department){
    departmentMapper.update(department);
    return department;
}

@CacheEvict

@CacheEvict 缓存删除

参数



key 清除指定缓存

allEntries  清除所有缓存

beforeInvocation 清除缓存在方法运行之前执行 默认false=方法之后执行



// 清除单个缓存
@CacheEvict(value = "department", key="#id")
public String  delete(Integer id){
    return "success";
}
// 清除所有缓存
@CacheEvict(value = "department", allEntries = true)
    public String  deleteAllCache(){
        return "success";
    }
相关文章
|
4天前
|
XML Java 应用服务中间件
【JavaEE】JavaEE进阶:框架的学习 - Spring的初步认识
【JavaEE】JavaEE进阶:框架的学习 - Spring的初步认识
9 0
|
4天前
|
Java 开发工具 Maven
根据SpringBoot Guides完成进行示例学习(详细步骤)
根据SpringBoot Guides完成进行示例学习(详细步骤)
7 1
|
4天前
|
移动开发 前端开发 NoSQL
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
51 0
|
4天前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
24 0
|
4天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
17 1
|
4天前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
|
4天前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
4天前
|
XML Java 数据格式
Spring学习__一篇足矣
Spring学习__一篇足矣
Spring学习__一篇足矣
|
4天前
|
Java Maven Docker
0.07 秒启动一个 SpringBoot 项目!Spring Native 很强!!
0.07 秒启动一个 SpringBoot 项目!Spring Native 很强!!
29 2
|
搜索推荐 Java 关系型数据库
SpringBoot学习笔记-11:第十一章-SpringBoot 与检索
SpringBoot学习笔记-11:第十一章-SpringBoot 与检索
SpringBoot学习笔记-11:第十一章-SpringBoot 与检索