解析springboot整合谷歌开源缓存框架Guava Cache原理

网友投稿 1284 2022-12-18

解析springboot整合谷歌开源缓存框架Guava Cache原理

解析springboot整合谷歌开源缓存框架Guava Cache原理

目录Guava Cache:⾕歌开源缓存框架Guava Cache使用使用压测⼯具Jmeter5.x进行接口压力测试:压测⼯具本地快速安装Jmeter5.x新增聚合报告:线程组->添加->-->聚合报告(Aggregate Report)

Guava Cache:⾕歌开源缓存框架

Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效。Guava官网介绍,下面的这几种情况可以考虑使用Guava Cache:

愿意消耗一些内存空间来提升速度。

预料到某些键会被多次查询。

缓存中存放的数据总量不会超出内存容量。

github地址:https://github.com/google/guava/wiki/CachesExplained

全内存的本地缓存实现,查询数据时先根据自定义索引判断Guava Cache中是否存在该数据,如果存在就从Guava Cache中取,不存在就从数据库中查询,再保存到Guava Cache中,减少数据库查询的压力

⾼性能且功能丰富

线程安全,操作简单 (底层实现机制类似ConcurrentMap)

Guava Cache使用

添加依赖

com.google.guava

guava

19.0

封装api工具类:

@Component

public class BaseCache {

private Cache tenMinuteCache = CacheBuilder.newBuilder()

//设置缓存初始大小,应该合理设置,后续会扩容

.initialCapacity(10)

//最大值

.maximumSize(100)

//并发数设置

.concurrencyLevel(5)

//缓存过期时间,写入后10分钟过期

.expireAfterWrite(600,TimeUnit.SECONDS)

//统计缓存命中率

.recordStats()

.build();

private Cache oneHourCache = CacheBuilder.newBuilder()

//设置缓存初始大小,应该合理设置,后续会扩容

.initialCapacity(30)

//最大值

.maximumSize(100)

//并发数设置

.concurrencyLevel(5)

//缓存过期时间,写入后1小时 过期

.expireAfterWrite(3600,TimeUnit.SECONDS)

//统计缓存命中率

.recordStats()

.build();

public Cache getOneHourCache() {

return oneHourCache;

}

public void setOneHourCache(Cache oneHourCache) {

this.oneHourCache = oneHourCache;

}

public Cache getTenMinuteCache() {

return tenMinuteCache;

}

public void setTenMinuteCache(Cache tenMinuteCache) {

this.tenMinuteCache = tenMinuteCache;

}

}

实际开发中使用:(查询数据时先根据自定义索引判断Guava Cache中是否存在该数据,如果存在就从Guava Cache中取,不存在就从数据库中查询,再保存到Guava Cache中)

自定义索引:

/**

* 缓存key管理类

*/

public class CacheKeyManager {

/**

* 首页轮播图缓存key

*/

public static final String INDEX_BANNER_KEY = "index:banner:list";

/**

* 首页视频列表缓存key

*/

public static final String INDEX_VIDEL_LIST = "index:video:list";

/**

* 视频详情缓存key, %s是视频id

*/

public static final String VIDEO_DETAIL = "video:detail:%s";

}

如果存在就从Guava Cache中取,不存在就从数据库中查询,再保存到Guava Cache中

@Service

public class VideoServiceImpl implements VideoService {

@Autowired

private VideoMapper videoMapper;

@Autowired

private BaseCache baseCache;

@Override

public List

try{

Object cacheObj = baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_VIDEL_LIST,()->{

List

return videoList;

});

if(cacheObj instanceof List){

List

return videoList;

}

}catch (Exception e){

e.printStackTrace();

}

//可以返回兜底数据,业务系统降级-》SpringCloud专题课程

return null;

}

@Override

public List listBanner() {

try{

Object cacheObj = baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_BANNER_KEY, ()->{

List bannerList = videoMapper.listVideoBanner();

System.out.println("从数据库里面找轮播图列表");

return bannerList;

});

if(cacheObj instanceof List){

List bannerList = (List)cacheObj;

return bannerList;

}

}catch (Exception e){

e.printStackTrace();

}

return null;

}

@Override

public Video findDetailById(int videoId) {

//单独构建一个缓存key,每个视频的key是不一样的

String videoCacheKey = String.format(CacheKeyManager.VIDEO_DETAIL,videoId);

try{

Object cacheObject = baseCache.getOneHourCache().get( videoCacheKey, ()->{

// 需要使用mybaits关联复杂查询

Video video = videoMapper.findDetailById(videoId);

return video;

});

if(cacheObject instanceof Video){

Video video = (Video)cacheObject;

return video;

}

}catch (Exception e){

e.printStackTrace();

}

return null;

}

}

使用压测⼯具Jmeter5.x进行接口压力测试:

压测⼯具本地快速安装Jmeter5.x

简介:GUI图形界⾯的安装 Jmeter5.x

需要安装JDK8 以上

建议安装JDK环境,虽然JRE也可以,但是压测https需要JDK⾥⾯的 keytool⼯具

快速- https://jmeter.apache.org/download_jmeter.cgi

⽂档地址:http://jmeter.apache.org/usermanual/get-started.html

解jmeter解压⽂件⾥⾯的各个⽬录:

bin:核⼼可执⾏⽂件,包含配置

jmeter.bat: winwDwOVERdows启动⽂件(window系统⼀定要配置显示⽂件拓展名)

jmeter: mac或者linux启动⽂件

jmeter-server:mac或者Liunx分布式压测使⽤的启动⽂件

jmeter-server.bat:window分布式压测使⽤的启动⽂件

jmeter.properties: 核⼼配置⽂件

extras:插件拓展的包

lib:核⼼的依赖包

Jmeter语⾔版本中英⽂切换

控制台修改 menu -> options -> choose language

配置⽂件修改

bin⽬录 -> jmeter.properties

默认 #language=en

改为 language=zh_CN

新增聚合报告:线程组->添加->-->聚合报告(Aggregate Report)

lable: sampler的名称

Samples: ⼀共发出去多少请求,例如10个⽤户,循环10次,则是 100

Average: 平均响应时间

Median: 中位数,也就是 50% ⽤户的响应时间

90% Line : 90% ⽤户的响应不会超过该时间 (90% of the samples took no more than

this time. The remaining samples at least as long as this)

95% Line : 95% ⽤户的响应不会超过该时间

99% Line : 99% ⽤户的响应不会超过该时间

min : 最⼩响应时间

max : 最⼤响应时间

Error%:错误的请求的数量/请求的总数

Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类⽐为

qps、tps

KB/Sec: 每秒接收数据量

启⽤缓存 压测热点数据接接⼝Throughput: 14000:

不启⽤缓存 压测热点数据接⼝

视频轮播图接⼝ Throughput : 2700

当数据访问量较大时,比如主页信息等,可以考虑使用Guava Cache,可以将程序频繁用到的少量数据存储到Guava Cache中,以改善程序性能!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用@PathVariable时候无法将参数映射到变量中的解决
下一篇:基于@RequestParam name和value属性的区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~