springboot整合⾕歌开源缓存框架Guava Cache使用

2023-05-16

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

  • 添加依赖
 <!--guava依赖包-->
 <dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>19.0</version>
 </dependency>
  • 封装api工具类:
@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中)

自定义索引:

/**
 * 缓存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<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
    public 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 this95% Line : 95% ⽤户的响应不会超过该时间
99% Line : 99% ⽤户的响应不会超过该时间
min : 最⼩响应时间
max : 最⼤响应时间
Error%:错误的请求的数量/请求的总数
Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类⽐为
qps、tps
KB/Sec: 每秒接收数据量

启⽤缓存 压测热点数据接接⼝Throughput: 14000:
在这里插入图片描述
在这里插入图片描述
不启⽤缓存 压测热点数据接⼝
视频轮播图接⼝ Throughput : 2700
在这里插入图片描述
在这里插入图片描述
当数据访问量较大时,比如主页信息等,可以考虑使用Guava Cache,可以将程序频繁用到的少量数据存储到Guava Cache中,以改善程序性能!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot整合⾕歌开源缓存框架Guava Cache使用 的相关文章

随机推荐

  • “异常处理”学习小结

    在我经历过的项目中 xff0c 很少使用异常处理 xff1b 对于问题的调试与追踪 xff0c 基本上都是基于错误码和日志信息 这里的学习总结来自于 lt lt C 43 43 编程思想 第2卷 gt gt 和网络 xff0c 有很多问题的
  • 重载new和delete检测内存泄漏

    内存泄漏就是new出来的内存没有通过delete合理的释放 重载new和delete检测内存泄漏原理是 xff1a 在重载的new中记录内存分配情况 xff0c 在重载的delete中删除内存分配记录 xff0c 从而跟踪所有内存分配信息
  • 《Effective C++》读后感

    几天前 xff0c 我曾在微信朋友圈中发了一条消息 xff1a 和大牛之间的差距就是这一个书架 图片来自于微信公众号 二爷鉴书 的分享 我时常纠结于自己的技术为什么进步的这么慢 xff0c 大概就是书读的太少 思考的太少 Effective
  • 《模仿游戏》观后感

    xfeff xfeff 几天前 xff0c 一个朋友让我给他推荐一部电影 xff0c 我思来想去 xff0c 推荐了 模仿游戏 这部电影讲述的是 计算机科学之父 艾伦 图灵在二战期间与其团队一起发明机器 英格玛 破译德国密码系统的故事 关于
  • 对项目的理解

    xfeff xfeff 又有好久没有更新博客了 xff0c 虽然我一直告诫自己 xff0c 不管有多忙都要找点时间来写博客 最近主要的精力都投入到项目中 xff0c 我就说说自己的一些想法吧 1 项目的前期是最忙的 xff0c 投入最大 当
  • 对项目的理解(2)

    xfeff xfeff 项目是做不完的 xff0c 把近期的一些想法写出来 xff1a 1 项目初期做好每一个功能的方案 项目初期 xff0c 有一个辅助功能被我忽略了 xff0c 以为 很容易实现 xff0c 就没有花时间去研究 xff0
  • 人工智能的过去

    人工智能的起源 xff1a 人工智能在五六十年代时正式提出 xff0c 1950年 xff0c 一位名叫马文 明斯基 后被人称为 人工智能之父 的大四学生与他的同学邓恩 埃德蒙一起 xff0c 建造了世界上第一台神经网络计算机 这也被看做是
  • instant app入门和开发指南

    本文由 a href http renyugang io 2018 05 17 writing 玉刚说写作平台 a 提供写作赞助 xff0c 赞助金额 xff1a 300元 原作者 xff1a AndroFarmer 版权声明 xff1a
  • 解决办法:关于在powershell中进不去anaconda环境

    对于cmd可以进入anaconda xff08 base xff09 环境 xff0c 但是powershell中不可以 xff0c 我的电脑的原因是我的user用户名是中文的 xff0c 先在控制面板和注册表中将用户名改为英文 再用Adm
  • 如何将文件传到Linux服务器中

    操作步骤 xff1a xff08 1 xff09 在本机安装Xftp xff08 2 xff09 连接目标服务器 xff08 3 xff09 选中对应的文件 xff0c 直接拖拽到Linux服务器中 xff0c 等待传输完成即可 如图所示
  • Matlab下多径衰落信道的仿真

    衰落信道参数包括多径扩展和多普勒扩展 时不变的多径扩展相当于一个延时抽头滤波器 xff0c 而多普勒扩展要注意多普勒功率谱密度 xff0c 通常使用Jakes功率谱 高斯 均匀功率谱 多径衰落信道由单径信道叠加而成 xff0c 而单径信道中
  • linux安装Python3

    0 注 xff1a 进行安装时我使用的用户是超级用户root xff0c 如果你不是超级用户在有些命令的前面需要添加sudo xff0c 也可以使用su命令切换成超级用户 1 查看是否有Python3 xff08 有时候虽然有包含但还是一堆
  • chapter8——消抖技术

    目录 1 简介2 开关行为3 开关种类4 消抖5 消抖指南 1 简介 在电子设备内两个金属触点随着触点的断开闭合便产生了多个信号 xff0c 这就是抖动 消抖 是用以确保在每一次断开或闭合触点时只有一个信号起作用的硬件设备或软件 机械开关和
  • 全新的视图绑定工具 — ViewBinding 使用指南

    本文首发于微信公众号 Android开发之旅 xff0c 欢迎关注 xff0c 获取更多技术干货 Jetpack版Wan Android项目地址 xff1a Android Jetpack架构开发组件化应用实战 欢迎star Flutter
  • webstorm(2019)配置eslint规范

    在项目中我们为了代码书写更规范 xff0c 在项目中安装ESlint帮助我们检查语法 xff0c 那么下面介绍下在webstorm中如何配置ESlint规范 步骤如下 xff1a 1 快捷键 ctrl 43 alt 43 s打开设置 xff
  • 与线程同步以及线程调度相关的方法

    wait xff1a 使一个线程处于等待 xff08 阻塞 xff09 状态 xff0c 并且释放所持有的对象的锁 xff1b sleep xff1a 使一个正在运行的线程处于睡眠状态 xff0c 是一个静态方法 xff0c 调用此方法要处
  • MongoDB 的功能

    面向集合的存储 xff1a 适合存储对象及 JSON 形式的数据 动态查询 xff1a Mongo 支持丰富的查询表达式 查询指令使用 JSON 形式的标记 xff0c 可轻易查询文档中内嵌的对象及数组 完整的索引支持 xff1a 包括文档
  • Redis 有哪些特性?

    1 速度快 xff1a 使用标准 C 写 xff0c 所有数据都在内存中完成 xff0c 读写速度分别达到 10 万 20 万 2 持久化 xff1a 对数据的更新采用 Copy on write 技术 xff0c 可以异步地保存到磁盘上
  • 在树莓派4b上安装kali linux 2019.4并启用vnc服务

    安装 x11vnc 工具 root 64 kali apt install y x11vnc 设置密码 root 64 kali x11vnc storepasswd 设置服务 新建 lib systemd system x11vnc se
  • springboot整合⾕歌开源缓存框架Guava Cache使用

    Guava Cache使用 Guava Cache xff1a 歌开源缓存框架Guava Cache使用使用压测 具Jmeter5 x进行接口压力测试 xff1a 压测 具本地快速安装Jmeter5 x新增聚合报告 xff1a 线程组 gt