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";
    }
相关文章
|
2月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
446 2
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2876 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
631 5
存储 JSON Java
540 0
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1411 0
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
237 2
|
缓存 Java Spring
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
201 0