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";
    }
相关文章
|
15天前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
21 0
|
16天前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
86 12
|
16天前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
59 10
|
13天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
50 5
|
12天前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
29 3
|
14天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
31 4
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
57 9
|
28天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
39 2
|
1月前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
154 2
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
38 9