spring data Redis整合spring cache实战(附源码及源码分析)

这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

最近在研究缓存框架,打算写一个多级缓存框架的sdk。所以想借鉴(抄袭)下spring的缓存框架的实现

spring cache reids

spring cache对各种缓存进行了整合抽象。核心的接口是CacheManager

可以看到有很多CacheManager的实现,之前写过本地缓存Caffeine的分布式扩展。其中使用的就是SimpleCacheManager

今天来看看spring boot是如何自动整合装配redis实现缓存的

整合实战

  • spring boot version: 2.7.0
  1. 引入依赖
xml 复制代码
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  1. 添加CacheConfig配置
java 复制代码
@Configuration(proxyBeanMethods = false)
public class CacheConfig {

    @Bean
    public RedisCacheConfiguration cacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(60))
            .disableCachingNullValues()
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }

    @Bean
    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
        return (builder) -> builder
            .withCacheConfiguration("student",
                RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)))
            .withCacheConfiguration("customerCache",
                RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)));
    }
    
    
}
  1. 添加redis配置
yml 复制代码
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    database: 1

这里随便配置了两个缓存,一个名字叫student,一个叫customerCache

  1. 使用
java 复制代码
@RestController
@Slf4j
@RequiredArgsConstructor
public class TestController {

    @GetMapping("/test")
    @Cacheable(value = "student")
    public  List<StudentVO> test(String name) {
        return mockSelectSql();
    }

    private List<StudentVO> mockSelectSql() {
        log.info("开始查询数据");
        List<StudentVO> studentVOS = Lists.newArrayList(new StudentVO(1L, "小奏技术", 18), new StudentVO(2L, "小奏技术1", 19));
        return studentVOS;
    }
    
}

可以看到使用spring cache提供的@Cacheable就自动整合上了。是不是非常简单

我们来简单看一下源码吧

实现原理

我们来探究下引入spring-boot-starter-data-redis是如何完成自动装配的

我们首先看看CacheManager的实现吧

可以看到spring-boot-starter-data-redis中有一个RedisCacheManager

RedisCacheManager实现了CacheManager,那么RedisCacheManager是如何自动装配的呢

spring-boot-autoconfigure中存在RedisCacheConfiguration这个类

如果你没有配置CacheManager这个bean,并且存在RedisConnectionFactory这个bean和class就会出发RedisCacheConfiguration的自动装配

RedisConnectionFactory则存在于spring-boot-starter-data-redis

有两个实现

这里我们就不继续深入追踪了,已经可以看到RedisCacheManager是如何自动装配的

spring cache中对CacheManager进行了封装。所有的缓存操作都由CacheManager去实现。

所以底层你要实现自己的cache逻辑或者说各种不同的cache,核心是实现自己的CacheManager

至于缓存的维护,还记得我们配置的缓存吗

这里的RedisCacheManagerBuilderCustomizer实际是一个函数式接口。 真正的执行逻辑还是在withCacheConfiguration

都丢在一个map里面

最终将这个map传入到RedisCacheManager

Spring中缓存的抽象类AbstractCacheManager就有一个抽象方法loadCaches

用来实现缓存的加载的,最终reids的缓存配置加载就是通过重写loadCaches

RedisCache则实现了Cache接口

从而实现redis的各种缓存操作。spring cache就是操作Cache

自此大致分析了spring-boot-starter-data-redis是如何自动整合spring cache

源码

相关推荐
JIngJaneIL4 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
晚风吹人醒.4 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
这是程序猿4 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
i***t9195 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
k***08295 小时前
【监控】spring actuator源码速读
java·spring boot·spring
一 乐5 小时前
应急知识学习|基于springboot+vue的应急知识学习系统(源码+数据库+文档)
数据库·vue.js·spring boot
@大迁世界5 小时前
相信我兄弟:Cloudflare Rust 的 .unwrap() 方法在 330 多个数据中心引发了恐慌
开发语言·后端·rust
vx_dmxq2115 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php
5***g2985 小时前
新手如何快速搭建一个Springboot项目
java·spring boot·后端
itmrl6 小时前
Redis高可用方案之集群模式搭建
redis