Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringCache整合SpringDataRedis

SpringCache整合SpringDataRedis

原创
作者头像
是小张啊喂
修改于 2021-05-17 03:07:45
修改于 2021-05-17 03:07:45
1.1K00
代码可运行
举报
文章被收录于专栏:软件软件
运行总次数:0
代码可运行

SpringCache一般不会单独使用,所以配合SpringDataRedis一起使用,直接上代码

当前基于 SpringBoot 2.4.5 实现

基于已经添加了spring-boot-starter-data-couchbase 还需要添加spring-boot-starter-data-redis依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

仔细观察org.springframework.cache.annotation.EnableCaching注解的注释,实现功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
负责注册必要的Spring组件,这些组件可以为注释驱动的缓存管理提供支持,例如CacheInterceptor以及基于代理或基于AspectJ的建议将调用@Cacheable方法时,拦截器将进入调用堆栈。如果存在JSR-107 API和Spring的JCache实现,则还将注册用于管理标准缓存注释的必要组件。 这将创建基于代理或基于AspectJ的建议,当调用以CacheResult , CachePut , CacheRemove或CacheRemoveAll注释的方法时,将拦截器编织到调用堆栈中。
必须注册CacheManager类型的Bean ,因为没有合理的默认值可以将该框架用作约定。 尽管<cache:annotation-driven>元素假定一个名为“ cacheManager”的bean,但@EnableCaching按类型搜索一个cache manager bean。 因此,高速缓存管理器bean方法的命名并不重要。
对于那些希望在@EnableCaching和要使用的确切缓存管理器bean之间建立更直接关系的@EnableCaching ,可以实现CachingConfigurer回调接口

这里有个问题,CachingConfigurer的类型为interface。即实现所有的方法,查看它的实现CachingConfigurerSupport类,具有空方法的CachingConfigurer的实现,允许子类仅覆盖其感兴趣的方法。

查看CachingConfigurer源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CachingConfigurerSupport implements CachingConfigurer {

    /**
    * 返回高速缓存管理器bean,以用于注释驱动的高速缓存管理。 默认的CacheResolver将使用此缓存管理器在后台初始化。 
    * 为了更精细地管理缓存分辨率,请考虑直接设置CacheResolver, 实现必须显式声明@Bean 
    */
	@Override
	@Nullable
	public CacheManager cacheManager() {
		return null;
	}
   /**
    * 返回CacheResolver bean,用于解析注释驱动的缓存管理的常规缓存。这是指定要使用的CacheManager的替代方法,且
    * 功能更强大。如果同时设置了cacheManager()和#cacheResolver() ,则忽略缓存管理器。实现必须显式声明@Bean 
    */
	@Override
	@Nullable
	public CacheResolver cacheResolver() {
		return null;
	}
   /**
    * 返回密钥生成器Bean,以用于注释驱动的缓存管理。 实现必须显式声明@Bean 
    */
	@Override
	@Nullable
	public KeyGenerator keyGenerator() {
		return null;
	}
   /**
    * 返回CacheErrorHandler以用于处理与缓存相关的错误。默认情况下,
    * 使用org.springframework.cache.interceptor.SimpleCacheErrorHandler ,
    * 并且仅将异常抛出回客户端。实现必须显式声明@Bean 
    */
	@Override
	@Nullable
	public CacheErrorHandler errorHandler() {
		return null;
	}

}

现在也做一个CachingConfigurerSupport的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 自定义实现 缓存处理器 将redis修改为默认的缓存处理器
     *
     * @return
     * @see org.springframework.cache.CacheManager
     */
    @Bean
    @Override
    public CacheManager cacheManager() {
        return super.cacheManager();
    }

    /**
     * 实现自定义的密钥
     * (如果没有自定义实现这个方法会出现什么情况,自定义生成的 redis 键 会像这样 SimpleKey [])
     *
     * @return
     * @see org.springframework.cache.interceptor.KeyGenerator
     */
    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return super.keyGenerator();
    }
}

但是这样有个问题,如何才能将缓存管理器交由Reids管理呢?

有这样的一个类org.springframework.data.redis.cache.RedisCacheManager,可以看到它的作用是

Redis缓存支持的org.springframework.cache.CacheManager 。 默认情况下,此高速缓存管理器在首次写入时创建高速缓存。 由于Redis如何表示空数据结构,因此在Redis上看不到空缓存。 可以通过RedisCacheManager.RedisCacheManagerBuilder.withInitialCacheConfigurations(Map)来指定需要与默认配置不同的RedisCacheConfiguration缓存

所以我们需要配置一个redis的缓存管理器RedisCacheManager,观察RedisCacheManager的构造函数 刚开始可以选择使用最简单的一个构造函数,这个构造函数需要两个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 创建新RedisCacheManager使用给定RedisCacheWriter和默认RedisCacheConfiguration 。
 */
public RedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
	this(cacheWriter, defaultCacheConfiguration, true);
}
  • RedisCacheWriter提供对用于缓存的Redis命令( SET, SETNX, GET, EXPIRE,… )的低级访问。 RedisCacheWriter可以由多个缓存实现共享,并负责将二进制数据写入Redis或从Redis读取二进制数据。 该实现采用可能设置的潜在缓存锁定标志。
  • RedisCacheConfiguration提供配置redis的缓存配置

RedisCacheWriter有两个静态方法,但是都需要RedisConnectionFactory

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 创建没有锁定行为的新RedisCacheWriter 
 */
static RedisCacheWriter nonLockingRedisCacheWriter(RedisConnectionFactory connectionFactory) {
	Assert.notNull(connectionFactory, "ConnectionFactory must not be null!");
	return new DefaultRedisCacheWriter(connectionFactory);
}

/**
 * 创建有锁定行为的新RedisCacheWriter 
 */
static RedisCacheWriter lockingRedisCacheWriter(RedisConnectionFactory connectionFactory) {
	Assert.notNull(connectionFactory, "ConnectionFactory must not be null!");
	return new DefaultRedisCacheWriter(connectionFactory, Duration.ofMillis(50));
}

又有一个新的问题RedisConnectionFactory 属于接口,需要如何配置? RedisConnectionFactory下有一个实现JedisConnectionFactoryJedisConnectionFactory可以通过Jedis配置连接工厂

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.0</version>
</dependency>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**
 * Redis服务器地址
 */
@Value("${spring.redis.host}")
private String host;

/**
 * Redis服务端口
 */
@Value("${spring.redis.port}")
private int port;

/**
 * Redis服务密码
 */
@Value("${spring.redis.password}")
private String password;

/**
 * Redis服务器地址
 */
@Value("${spring.redis.database}")
private int database;

/**
 * redis 连接工厂 必须注册为 Bean
 *
 * @return
 */
@Bean
public JedisConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);
    config.setDatabase(database);
    config.setPassword(password);
    return new JedisConnectionFactory(config);
}

RedisCacheConfiguration提供了默认的配置,即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RedisCacheConfiguration.defaultCacheConfig();

默认配置具有以下特点:

功能

描述

密钥到期

永恒

缓存空值

是的

前缀缓存键

是的

默认前缀

[实际缓存名称]

密钥序列化器

org.springframework.data.redis.serializer.StringRedisSerializer

值序列化器

org.springframework.data.redis.serializer.JdkSerializationRedisSerializer

转换服务

具有default缓存密钥转换器的DefaultFormattingConversionService

现在开始配置 RedisCacheManager

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 自定义实现 缓存处理器 将redis修改为默认的缓存处理器
 *
 * @return
 * @see org.springframework.data.redis.cache.RedisCacheManager
 */
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
    return new RedisCacheManager(RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory), redisCacheConfiguration());
}

这样就可以实现将SpringCache缓存交由Redis去管理。

在这样的过程中,不断的去查询官方的文档的代码,即使看不懂实现的方式,但是这样的过程就是在过度,不能操之过急,一步一步才能继续往下面走。若有不对欢迎指出

喜欢编程的,请关注我的博客https://www.lzmvlog.top/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Cache优化
缓存是web项目不可或缺的一部分,通过缓存能够降低服务器数据库压力,提高服务器的稳定性及响应速度。
用户4283147
2022/10/27
8250
Spring Cache优化
玩转Spring Cache --- 整合分布式缓存Redis Cache(使用Lettuce、使用Spring Data Redis)【享学Spring】
最近都在聊Spring的缓存抽象Spring Cache,上篇文章深入介绍了Spring Cache集成进程缓存的第三方组件如Caffeine、Ehcache,若对此篇文章感兴趣,可移步观看:【小家Spring】玩转Spring Cache — 整合进程缓存之王Caffeine Cache和Ehcache3.x
YourBatman
2019/09/03
6.1K0
玩转Spring Cache --- 整合分布式缓存Redis Cache(使用Lettuce、使用Spring Data Redis)【享学Spring】
Spring Boot二级缓存配置
之前说了使用JdbcTemplate、MyBatis、Spring Data JPA三种连接数据库的方式。
码客说
2024/01/18
4430
Spring Boot二级缓存配置
SpringCache实战遇坑
但你在网上找答案,都是文不对题,或者说其他错误导致相同的报错,反正我是找不到正确的解答
老梁
2019/09/10
5220
Spring Cache解析
本文基于springboot2.3.7版本进行分析,对应的spring-context版本为5.2.12,官方文档地址如下:
程序员小义
2024/04/10
1750
Spring Cache解析
你知道如何在springboot中使用redis吗
特别说明:本文针对的是新版 spring boot 2.1.3,其 spring data 依赖为 spring-boot-starter-data-redis,且其默认连接池为 lettuce
用户2038589
2019/06/02
1.3K0
Spring 框架:配置缓存管理器、注解参数与过期时间
SimpleCacheManager 是 Spring 提供的简单缓存管理器,用于管理内存缓存。适用于开发和测试阶段,或数据量小、缓存一致性要求不高的场景。
Yeats_Liao
2025/01/11
2000
Spring 框架:配置缓存管理器、注解参数与过期时间
SpringBoot中Shiro缓存使用Redis、Ehcache
SpringBoot 中配置redis作为session 缓存器。 让shiro引用
云扬四海
2019/08/19
2.8K0
聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及自动刷新
用过spring cache的朋友应该会知道,Spring Cache默认是不支持在@Cacheable上添加过期时间的,虽然可以通过配置缓存容器时统一指定。形如
lyb-geek
2022/11/18
5.5K0
聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及自动刷新
玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】
在上篇文章讲解整合分布式缓存Redis时埋下了一个伏笔:如何让我们的缓存注解支持自定义TTL失效时间呢?
YourBatman
2019/09/03
9.1K2
玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】
聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及即将到期自动刷新
用过spring cache的朋友应该会知道,Spring Cache默认是不支持在@Cacheable上添加过期时间的,虽然可以通过配置缓存容器时统一指定。形如
lyb-geek
2022/10/11
5.9K1
聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及即将到期自动刷新
spring boot 集成redis版本说明
官网文档:https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/
全栈程序员站长
2022/07/28
1.6K0
【详解】@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案
在Spring Boot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能。当选择Redis作为缓存存储时,如果Redis服务因某种原因不可用(如宕机、网络问题等),默认情况下,​​@Cacheable​​注解会抛出异常,导致整个请求失败。本文将探讨如何在Redis不可用时,让​​@Cacheable​​注解继续调用原方法,确保服务的可用性和稳定性。
大盘鸡拌面
2025/04/11
2330
【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案
之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的、分布式的缓存解决方案,使用默认的这种缓存方式,只是在当前进程里缓存了而已。Spring Cache整合Redis来实现缓存,其实也不是一件复杂的事情,下面就开始吧。
Happyjava
2019/07/26
1.4K0
【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案
springboot配置RedisTemplate和RedisCacheManager
1、项目目录结构: 2、application.properties配置文件: 我这里redis连的是虚拟机上面的,你改下host地址就行 spring.datasource.url=jdbc:mysql://localhost:3306/spring_cache spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jd
别团等shy哥发育
2023/02/25
1.3K0
springboot配置RedisTemplate和RedisCacheManager
springBoot 缓存开发
package catchManager; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; /**
用户5927264
2019/08/01
4040
Spring cache 使用Redis做分布式缓存
DemoApplication启动类头部加入@EnableCaching开启缓存 redis.config配置
阿提说说
2022/12/02
6060
java工具类(redis配置工具包)
package com.adingxiong.pm.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import
java攻城狮
2020/10/10
9840
SpringBoot与缓存
beforeInvocation = true: 代表清除缓存操作在方法运行之前执行,无论方法是否出现异常,缓存都要清除。
OY
2022/03/12
4700
SpringBoot与缓存
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
    小白问小明:“你前面有一个5米深的坑,里面没有水,如果你跳进去后该怎样出来了?”小明:“躺着出来呗,还能怎么出来?”小白:“为什么躺着出来?”小明:“5米深的坑,还没有水,跳下去不死就很幸运了,残是肯定会残的,不躺着出来,那能怎么出来?”小白:“假设没死也没残呢?”小明:“你当我超人了? 那也简单,把脑子里的水放出来就可以漂出来了。”小白:“你脑子里有这么多水吗?”小明:“我脑子里没那么多水我跳下去干嘛?” 
青石路
2018/12/06
2.6K0
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
推荐阅读
相关推荐
Spring Cache优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验