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

  • 添加依赖
 <!--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
    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原理的文章就介绍到这了,更多相关框架整合内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring+SpringMVC+MyBatis整合实战(SSM框架)

    目录 SpringMVC Spring MyBatis 项目结构 maven配置文件pom.xml webapp配置文件web.xml spring配置文件applicationContext.xml spring-mvc配置文件spring-mvc.xml mybatis映射文件AccountMapper.xml mybatis配置文件(两种整合方法) 日志配置文件log4j.properties 建表语句 Tomcat传递过程 在写代码之前我们先了解一下这三个框架分别是干什么的? Sprin

  • Java面试题冲刺第十八天--Spring框架3

    面试题1:Bean 的加载过程是怎样的? 我们知道, Spring 的工作流主要包括以下两个环节: 解析,读 xml 配置,扫描类文件,从配置或者注解中获取 Bean 的定义信息,注册一些扩展功能. 加载,通过解析完的定义信息获取 Bean 实例. 下面是跟踪了 getBean的调用链创建的流程图,为了能够很好地理解 Bean 加载流程,省略一些异常.日志和分支处理和一些特殊条件的判断. 从上面的流程图中,可以看到一个 Bean 加载主要会经历这么几个阶段(标绿内容): 获取 BeanName,

  • springboot log4j2不能打印框架错误日志的解决方案

    springboot log4j2为什么不能打印框架错误日志 问题 使用springboot时老的框架使用的是log4j2,为了兼容不能够使用logback,按照网上的教程导入了log4j2但是不能够输入框架错误日志,例如bean命名重复,springmvc url映射重复,这些都是开发中所需要的友好提示 解决方案 怎么出现的问题,就不详细描述了,原因是我引入的log42是散件不是基于springboot集成配置的,导致只能够输出基本信息,原理我会在 一个月后左右探究完毕补充. 下面我说说怎么正

  • SpringBoot整合Security实现权限控制框架(案例详解)

    目录 一.前言 二.环境准备 2.1.数据库表 四.测试 五.总结 我想每个写项目的人,都肯定会遇到控制权限这个问题. 例如这个这个链接只能管理员访问,那个链接丫只能超级管理员访问等等,实现方式也有多种多样,控制的粒度也不一样. 以前刚学的时候,不会框架,大都是手写注解+过滤器来进行权限的控制,但这样增加了过滤器的负担.用起来也会稍微有些麻烦,粒度不太好控制. 用框架的话,就是封装了更多的操作,让一切更简单吧.当然不局限于Security,还有像Shiro安全框架,这两种非常常见. 一起加油吧!

  • 手把手写Spring框架

    目录 初始化阶段 运行阶段 HandlerAdapter 形参列表:编译后就能拿到值 实参列表:要运行时才能拿到值 最后反射 总结: 这部分目标是MVC! 主要完成3个重要组件: HandlerMapping:保存URL映射关系 HandlerAdapter:动态参数适配器 ViewResolvers:视图转换器,模板引擎 SpringMVC核心组件执行流程: 相对应的,用以下几个类来实现上述的功能: 初始化阶段 在DispatcherServlet这个类的init方法中,将mvc部分替换为in

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

    目录 Guava Cache:⾕歌开源缓存框架 Guava Cache使用 使用压测⼯具Jmeter5.x进行接口压力测试: 压测⼯具本地快速安装Jmeter5.x 新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report) Guava Cache:⾕歌开源缓存框架 Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效.Guava官网介绍,下面的这几种情况可以考虑使用Guava Cache: 愿意消耗一些内存空间

  • 详解springboot整合ehcache实现缓存机制

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题. spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的

  • spring-boot整合ehcache实现缓存机制的方法

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题. spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的

  • ehcache开源缓存框架_动力节点Java学院整理

    Ehcache是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google:对于API,官网上介绍已经非常清楚,请参见官网:但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存感兴趣的朋友有所收获. 一.特性一览,来自官网,简单翻译一下:  1.快速轻量 过去几年,

  • springboot整合jquery和bootstrap框架过程图解

    这篇文章主要介绍了springboot整合jquery和bootstrap框架过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.4.1</version> </dependency>

  • SpringBoot整合RedisTemplate实现缓存信息监控的步骤

    SpringBoot 整合 Redis 数据库实现数据缓存的本质是整合 Redis 数据库,通过对需要“缓存”的数据存入 Redis 数据库中,下次使用时先从 Redis 中获取,Redis 中没有再从数据库中获取,这样就实现了 Redis 做数据缓存.    按照惯例,下面一步一步的实现 Springboot 整合 Redis 来存储数据,读取数据. 1.项目添加依赖首页第一步还是在项目添加 Redis 的环境, Jedis. <dependency> <groupId>org.

  • SpringBoot整合log4j日志与HashMap的底层原理解析

    一,SpringBoot与日志 1.springboot整合log4j日志记录 1.在resources目录下面创建日志文件,并引入: 代码如下(示例): #log4j.rootLogger=CONSOLE,info,error,DEBUG log4j.rootLogger=info,error,CONSOLE,DEBUG log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=o

  • 详解SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)

    引言 ​前两天在写一个实时数据处理的项目,项目要求是 1s 要处理掉 1k 的数据,这时候显然光靠查数据库是不行的,技术选型的时候老大跟我提了一下使用 Layering-Cache 这个开源项目来做缓存框架. ​之间问了一下身边的小伙伴,似乎对这块了解不多.一般也就用用 Redis 来缓存,应该是很少用多级缓存框架来专门性的管理缓存吧. ​趁着这个机会,我多了解了一些关于 SpringBoot 中缓存的相关技术,于是有了这篇文章! 在项目性能需求比较高时,就不能单单依赖数据库访问来获取数据了,必

  • Springboot +redis+谷歌开源Kaptcha实现图片验证码功能

    背景 注册-登录-修改密码⼀般需要发送验证码,但是容易被 攻击恶意调⽤ 什么是短信-邮箱轰炸机 手机短信轰炸机是批.循环给⼿机⽆限发送各种⽹ 站的注册验 证码短信的方法. 公司带来的损失 短信⼀条5分钱,如果被⼤盗刷大家自己计算 邮箱通知不⽤钱,但被⼤盗刷,带宽.连接等都被占⽤,导致无法正常使⽤ 如何避免自己的网站成为”肉鸡“或者被刷呢 增加图形验证码(开发人员) 单IP请求次数限制(开发人员) 限制号码发送(⼀般短信提供商会做) 攻防永远是有的,只过加大了攻击者的成本,ROI划不过来⾃然就放弃

  • 解析SpringBoot整合SpringDataRedis的过程

    Spring-Data-Redis项目(简称SDR)对Redis的Key-Value数据存储操作提供了更高层次的抽象,类似于Spring Framework对JDBC支持一样. 项目主页: http://projects.spring.io/spring-data-redis/ 项目文档: http://docs.spring.io/spring-data/redis/docs/1.5.0.RELEASE/reference/html/ 本文给大家介绍SpringBoot整合SpringData

随机推荐