返回顶部
首页 > 资讯 > 后端开发 > Python >解析springboot整合谷歌开源缓存框架Guava Cache原理
  • 437
分享到

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

2024-04-02 19:04:59 437人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录Guava Cache:⾕歌开源缓存框架Guava Cache使用使用压测⼯具jmeter5.x进行接口压力测试:压测⼯具本地快速安装J

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使用

  •  添加依赖

 <!--guava依赖包-->
 <dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>19.0</version>
 </dependency>

@Component
public class BaseCache {
    private Cache<String,Object> tenMinuteCache = CacheBuilder.newBuilder()
            //设置缓存初始大小,应该合理设置,后续会扩容
            .initialCapacity(10)
            //最大值
            .maximumSize(100)
            //并发数设置
            .concurrencyLevel(5)
            //缓存过期时间,写入后10分钟过期
            .expireAfterWrite(600,TimeUnit.SECONDS)
            //统计缓存命中率
            .recordStats()
            .build();

    private Cache<String,Object> oneHourCache = CacheBuilder.newBuilder()
            //设置缓存初始大小,应该合理设置,后续会扩容
            .initialCapacity(30)
            //最大值
            .maximumSize(100)
            //并发数设置
            .concurrencyLevel(5)
            //缓存过期时间,写入后1小时 过期
            .expireAfterWrite(3600,TimeUnit.SECONDS)
            //统计缓存命中率
            .recordStats()
            .build();


    public Cache<String, Object> getOneHourCache() {
        return oneHourCache;
    }
    public void setOneHourCache(Cache<String, Object> oneHourCache) {
        this.oneHourCache = oneHourCache;
    }
    public Cache<String, Object> getTenMinuteCache() {
        return tenMinuteCache;
    }
    public void setTenMinuteCache(Cache<String, Object> tenMinuteCache) {
        this.tenMinuteCache = tenMinuteCache;
    }
}
  • 实际开发中使用:(查询数据时先根据自定义索引判断Guava Cache中是否存在该数据,如果存在就从Guava Cache中取,不存在就从数据库中查询,再保存到Guava Cache中)

自定义索引:



public class CacheKeyManager {

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

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

    
    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<Video> listVideo() {
        try{
          Object cacheObj =  baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_VIDEL_LIST,()->{
                List<Video> videoList = videoMapper.listVideo();
                return videoList;
            });
          if(cacheObj instanceof List){
              List<Video> videoList = (List<Video>)cacheObj;
              return videoList;
          }
        }catch (Exception e){
            e.printStackTrace();
        }
        //可以返回兜底数据,业务系统降级-》SpringCloud专题课程
        return null;
    }

    @Override
    publc List<VideoBanner> listBanner() {
        try{
            Object cacheObj =  baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_BANNER_KEY, ()->{
                List<VideoBanner> bannerList =  videoMapper.listVideoBanner();
                System.out.println("从数据库里面找轮播图列表");
                return bannerList;
            });
            if(cacheObj instanceof List){
                List<VideoBanner> bannerList = (List<VideoBanner>)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: windows启动⽂件(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中,以改善程序性能!

到此这篇关于解析SpringBoot整合谷歌开源缓存框架Guava Cache原理的文章就介绍到这了,更多相关框架整合内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 解析springboot整合谷歌开源缓存框架Guava Cache原理

本文链接: https://lsjlt.com/news/132773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作