SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)
作者:xfgg 时间:2023-10-02 05:20:58
1. 缓存、两级缓存
1.1 内容说明
Spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明
springboot+spring cache:rediscache实现中的缺陷
caffeine简介
spring boot+spring cache实现两级缓存
使用缓存时的流程图
1.2 Sping Cache
spring cache是spring-context包中提供的基于注解方式使用的缓存组件,定义了一些标准接口,通过实现这些接口,就可以通过在方法上增加注解来实现缓存。这样就能够避免缓存代码与业务处理耦合在一起的问题。spring cache的实现是使用spring aop中对方法切面(MethodInterceptor)封装的扩展,当然spring aop也是基于Aspect来实现的。
spring cache核心的接口就两个:Cache和CacheManager
1.2.1 Cache接口
提供缓存的具体操作,比如缓存的放入,读取,清理,spring框架中默认提供的实现有
1.2.2 CacheManager接口
主要提供Cache实现bean的创建,每个应用里可以通过cacheName来对Cache进行隔离,每个CaheName对应一个Cache实现,spring框架中默认提供的实现与Cache的实现都是成对出现的
1.2.3 常用的注解说明
@Cacheable:主要应用到查询数据的方法上
@CacheEvict:清除缓存,主要应用到删除数据的方法上
@CachePut:放入缓存,主要用到对数据有更新的方法上
@Caching:用于在一个方法上配置多种注解
@EnableCaching:启用spring cache缓存,作为总的开关,在spring boot的启动类或配置类上需要加入次注解才会生效
2.实战多级缓存的用法
package com.xfgg.demo.config;
import lombok.AllArgsConstructor;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@AllArgsConstructor
//把定义的缓存加入到Caffeine中
public class CacheConfig {
@Bean
public CacheManager cacheManager(){
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
//使用refreshAfterWrite必须要设置cacheLoader
//在5分钟内没有创建/覆盖时,会移除该key,下次取的时候从loading中取【重点:失效、移除Key、失效后需要获取新值】
.expireAfterWrite(5, TimeUnit.MINUTES)
//初始容量
.initialCapacity(10)
//用来控制cache的最大缓存数量
.maximumSize(150)
);
return cacheManager;
}
}
package com.xfgg.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
//生成的redis连接
public class RedisConfig<GenericObjectPoolConfig> {
@Value("${spring.redis1.host}")
private String host;
@Value("${spring.redis1.port}")
private Integer port;
@Value("${spring.redis1.password}")
private String password;
@Value("${spring.redis1.database}")
private Integer database;
@Value("${spring.redis1.lettuce.pool.max-active}")
private Integer maxActive;
@Value("${spring.redis1.lettuce.pool.max-idle}")
private Integer maxIdle;
@Value("${spring.redis1.lettuce.pool.max-wait}")
private Long maxWait;
@Value("${spring.redis1.lettuce.pool.min-idle}")
private Integer minIdle;
@Bean
public RedisStandaloneConfiguration redis1RedisConfig() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPassword(RedisPassword.of(password));
config.setPort(port);
config.setDatabase(database);
return config;
}
//配置序列化器
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object>template=new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
一个使用cacheable注解,一个使用redistemplate进行缓存
因为公司项目中用到的是jedis和jediscluster所以这里只是做个了解,没有写的很细
来源:https://blog.csdn.net/qq_42337039/article/details/113994722
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
解决grails服务端口冲突的办法(grails修改端口号)
c#基于NVelocity实现代码生成
![](https://img.aspxhome.com/file/2023/8/113828_0s.png)
gateway网关与前端请求跨域问题的解决方案
![](https://img.aspxhome.com/file/2023/1/69741_0s.png)
C语言char s[]和char* s的区别
![](https://img.aspxhome.com/file/2023/5/114935_0s.png)
IDEA搭建dubbo项目的过程及存在的问题
![](https://img.aspxhome.com/file/2023/5/64065_0s.jpg)
java简单解析xls文件的方法示例【读取和写入】
Kotlin List与Set和Map实例讲解
Flutter实现笑嘻嘻的动态表情的示例代码
![](https://img.aspxhome.com/file/2023/6/138946_0s.png)
Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码
Spring Cache+Redis缓存数据的实现示例
![](https://img.aspxhome.com/file/2023/0/60060_0s.png)
详解Java中方法重写和方法重载的6个区别
![](https://img.aspxhome.com/file/2023/2/60072_0s.jpg)
Java异常的处理机制
![](https://img.aspxhome.com/file/2023/7/71147_0s.png)
C#算法之各位相加
Winform应用程序如何使用自定义的鼠标图片
C#实现图表中鼠标移动并显示数据
![](https://img.aspxhome.com/file/2023/6/108746_0s.jpg)
Java接口默认方法带来的问题分析【二义性问题】
![](https://img.aspxhome.com/file/2023/7/60117_0s.png)
AndroidStudio替换项目图标ic_launcher操作
![](https://img.aspxhome.com/file/2023/1/122061_0s.jpg)
spring AOP的After增强实现方法实例分析
图形学之Unity渲染管线流程分析
![](https://img.aspxhome.com/file/2023/9/87029_0s.jpg)