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


猜你喜欢
- 本文实例讲述了C#动态调用事件的方法。一般来说,传统的思路是,通过Reflection.EventInfo获得事件的信息,然后使用GetRa
- goto在Java中是一个保留字,但在语言中并没有用到它;Java没有goto。但是,Java也能完成一些类似于跳转的操作,主要是依靠:标签
- Spring Boot文件上传与下载在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设
- 缓存淘汰算法在高并发、高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对。第一次请求时把计算好的结果存放在缓存中,下次遇到同样
- 合并有序数组的实现java版本:实例代码public class Merge {//合并有序数组 public static v
- Spring 框架是一个流行的Java应用程序框架,它提供了许多强大的功能,如依赖注入和面向切面编程。然而在使用 Spring 框架时,我们
- 概述众所周知使用 JWT 做权限验证,相比 Session 的优点是,Session 需要占用大量服务器内存,并且在多服务器时就会涉及到共享
- 先上效果图这个效果来自于三星S5的充电界面,当然有些细节差别,主要看思路.本文目的是技术交流,不要将效果直接运用于商业产品和项目.电池背景因
- GradientTextViewGithub点我一个非常好用的库,使用kotlin实现,用于设置TexView的字体 渐变颜色、渐变方向 和
- 本文实例介绍了清除aspx页面缓存的程序实现方法,具体步骤如下:所有用到页面缓存的aspx页面修改以下cs,让它继承一个自定义基类(例如:P
- HttpServletRequest对象代表客户端的请求,当客户端通过HTTP
- 效果如下: 布局文件activity_main.xml如下:<RelativeLayout xmlns:android="h
- 本文实例讲述了Android编程处理窗口控件大小,形状,像素等UI元素工具类。分享给大家供大家参考,具体如下:/*** 处理窗口控件大小,形
- Alert顾名思义一就是一个警告框,一般使用情况比如:退出登录,清楚缓存,提示修改密码等等。。。ReactNative中的Alert只有一个
- 前言我们在上一篇文章 中以实例讲解如何定义和使用 lambda 表达式,以及与其它语言相比,lambda 表达式在 Java 中的特殊规范。
- 目录一、背景二、推荐方式2.1 自定义的枚举2.2 外部枚举三、总结一、背景平时工作开发过程中,难免会用到状态机(状态的流转)。如奖学金审批
- 前言:由于最近有解析协议的一些业务场景,需要用到一些字节操作工具,这里封装了一些比较常用的转换方法,测试后基本没有问题,可能一些比较偏门的数
- 1、什么是OpenCVSharp 为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的
- 对于config文件,一般情况下都是使用ConfigurationManager加载,然后通过读取相应节点的值来获取想要的数据,但是,有时候
- 1、@Configuration&@Bean给容器中注册组件@Configuration及@Bean的使用参考如下代码:packag