第一步:引入依赖
<!--guava本地缓存依赖包-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
第二步:新建本地java类
package com.qa.qcp.utils;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Log4j2
@Component
public class GuavaLocalCache {
private RemovalListener<String, Object> listener = notification -> log.info("removalListener is removed! key:[" + notification.getKey() + "], value:[" + notification.getValue()+"]");
private Cache<String,Object> tenMinuteCache = CacheBuilder.newBuilder()
//设置缓存初始大小,应该合理设置,后续会扩容
.initialCapacity(10)
//最大值
.maximumSize(100)
//并发数设置
.concurrencyLevel(5)
//缓存过期时间,写入后10分钟过期
.expireAfterWrite(600,TimeUnit.SECONDS)
// 此缓存对象经过多少秒没有被访问则过期。
.expireAfterAccess(10,TimeUnit.SECONDS)
//统计缓存命中率
.recordStats()
// 缓存移除监听器
.removalListener(listener)
.build();
private Cache<String,Object> oneHourCache = CacheBuilder.newBuilder()
//设置缓存初始大小,应该合理设置,后续会扩容
.initialCapacity(30)
//最大值 存储多少个对象
.maximumSize(100)
//并发数设置
.concurrencyLevel(5)
//可以同时用expireAfterAccess和expireAfterWrite方法指定过期时间,这时只要对象满足两者中的一个条件就会被自动过期删除。
//缓存过期时间,写入后1小时 过期
.expireAfterWrite(3600,TimeUnit.SECONDS)
// 此缓存对象经过多少秒没有被访问则过期。
.expireAfterAccess(10,TimeUnit.SECONDS)
//开启统计缓存命中率开关 通过cache.stats()信息查看统计结果
.recordStats()
.removalListener(listener)
.build();
public Cache<String, Object> getOneHourCache() {
return oneHourCache;
}
public void setOneHourCache(Cache<String, Object> oneHourCache) {
this.oneHourCache = oneHourCache;
log.debug("setOneHourCache ok");
}
public Cache<String, Object> getTenMinuteCache() {
log.debug(tenMinuteCache.stats());
return tenMinuteCache;
}
public void setTenMinuteCache(Cache<String, Object> tenMinuteCache) {
this.tenMinuteCache = tenMinuteCache;
log.debug("setTenMinuteCache ok");
}
}
第三步:使用
@Autowired
private GuavaLocalCache guavaLocalCache;
@Override
public AuthUser getUserByEmail(String email) {
try {
// 两个不一样的写法,上边这个更好体现回调的意思。
// Object cacheObj = guavaLocalCache.getTenMinuteCache().get(CacheKeyManager.USER_INFO_KEY, () -> {
// return authUserMapper.getUserByEmail(email);
// });
// 这个写法是 匿名函数直接回调。
// 实现的功能:如果内存中有 key user:info 则直接从内存中取,如果没有则回调authUserMapper.getUserByEmail(email)); 然后进行返回,同时将内容储存在内存中。
Object cacheObj = guavaLocalCache.getTenMinuteCache().get(“user:info”, () -> authUserMapper.getUserByEmail(email));
if (cacheObj instanceof AuthUser) {
return (AuthUser) cacheObj;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}