1.缓存简介
- 什么是缓存
- 程序经常要调用的对象存在内存中,方便其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能
- DNS缓存、前端缓存、代理服务器缓存Nginx、应用程序缓存(本地缓存、分布式缓存)、数据库缓存
- 分布式缓存
- 与应用分离的缓存组件或服务,与本地应用隔离一个独立的应用,多个应用可直接的共享缓存
- 常见的分布式缓存redis、memcached等
- 本地缓存
- 和业务程序一起的缓存,例如mybatis的一级或者二级缓存,本地缓存自然是最快的,但是不能在多个节点共享
- 常见的本地缓存:mybatis一级缓存、mybatis二级缓存;框架本身的缓存;redis本地单机服务;ehchche;guava cache;caffeine等
- (mybatis缓存笔记)
- 选择本地缓存和分布式缓存
- 和业务数据结合去选择
- 高并发项目里面一般是都有本地缓存和分布式缓存共同存在的
2.本地缓存Guava Cache
-
Guava Cache
- 全内存的本地缓存实现
- 高性能且功能丰富
- 线程安全、操作简单(底层实现机制类似ConcurrentMap)
-
添加依赖
<!--guava 本地缓存--> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>
-
封装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(); }
-
业务模块引入缓存核心代码
/** * 轮播图列表 * * @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; }