• Guava Cache使用


    1.缓存简介

    • 什么是缓存
      • 程序经常要调用的对象存在内存中,方便其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能
      • DNS缓存、前端缓存、代理服务器缓存Nginx、应用程序缓存(本地缓存、分布式缓存)、数据库缓存
    • 分布式缓存
      • 与应用分离的缓存组件或服务,与本地应用隔离一个独立的应用,多个应用可直接的共享缓存
      • 常见的分布式缓存redis、memcached等
    • 本地缓存
      • 和业务程序一起的缓存,例如mybatis的一级或者二级缓存,本地缓存自然是最快的,但是不能在多个节点共享
      • 常见的本地缓存:mybatis一级缓存、mybatis二级缓存;框架本身的缓存;redis本地单机服务;ehchche;guava cache;caffeine等
      • (mybatis缓存笔记)
    • 选择本地缓存和分布式缓存
      • 和业务数据结合去选择
      • 高并发项目里面一般是都有本地缓存和分布式缓存共同存在的

    2.本地缓存Guava Cache

    • Guava Cache

      • 全内存的本地缓存实现
      • 高性能且功能丰富
      • 线程安全、操作简单(底层实现机制类似ConcurrentMap)
    • 添加依赖

      
      <dependency>
        <groupId>com.google.guavagroupId>
          <artifactId>guavaartifactId>
          <version>18.0version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 封装api

      package com.gen.genonlineclassroom.config;
      
      import com.google.common.cache.Cache;
      import com.google.common.cache.CacheBuilder;
      import lombok.Getter;
      import lombok.Setter;
      import org.springframework.stereotype.Component;
      
      import java.util.concurrent.TimeUnit;
      
      /**
       * GuavaCache封装类
       */
      @Component
      public class GuavaCacheConfig {
      
          @Getter
          @Setter
          /**
           * 10分钟缓存
           */
          private Cache<String, Object> tenMinuteCache = CacheBuilder.newBuilder()
                  // 缓存初始大小
                  .initialCapacity(10)
                  // 缓存最大值
                  .maximumSize(100)
                  // 并发数设置
                  .concurrencyLevel(5)
                  // 缓存过期时间,10分钟后过期
                  .expireAfterWrite(10, TimeUnit.MINUTES)
                  // 统计缓存命中率
                  .recordStats().build();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
    • 业务模块引入缓存核心代码

      /**
       * 轮播图列表
       *
       * @return
       */
      @Override
      public List<VideoBanner> list() {
          try {
              Object cacheObj = this.guavaCacheConfig.getTenMinuteCache().get(CacheKeyConstant.VIDEO_BANNER_LIST, () -> {
                  return videoBannerMapper.selectList(new QueryWrapper<>());
              });
      
              if (cacheObj instanceof List) {
                  return (List<VideoBanner>) cacheObj;
              }
          } catch (Exception e) {
              log.error("轮播图列表报错==》{}", e);
          }
          return null;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
  • 相关阅读:
    ATF源码篇(八):docs文件夹-Components组件(7)固件配置框架
    CEC2018:动态多目标测试函数DF10~DF14的PS及PF
    常用Python自动化测试框架有哪些?优缺点对比
    web前端期末大作业网页设计与制作 ——汉口我的家乡旅游景点 5页HTML+CSS+JavaScript
    Java 深度优先搜索 and 广度优先搜索的算法原理和代码展示
    [buuctf.reverse] 121-125
    【Spring Boot 源码学习】@Conditional 条件注解
    电路基础元件
    JVM调优(一)之性能优化步骤
    Flutter开发者开发薪资高吗?前景怎么样
  • 原文地址:https://blog.csdn.net/2302_76363587/article/details/133275862