Guava缓存工具类封装和使用
本文为博主原创,未经允许不得转载:
Guava是谷歌提供的一款强大的java工具库,里面包含了很多方便且高效的工具,在项目开发中有业务场景需要保存数据到内存当中,
且只需要保存固定时间就可以,该数据只在服务调用其他服务的时候会获取。主要有两个场景:1.项目中需要调用第三方服务,第三方服务
每次调用时,需要获取第三方提供的token,,2.项目中需要校验第三方的一些固定数据。。所以考虑用Guava的缓存类,将上述中的数据
保存到Guava中,在获取的时候直接使用,如果没有则获取数据,并将其保存到Guava中。
第一步:定义Guava缓存基类,其中要实现 InitializingBean接口,这个接口为Spring提供的接口,:
import java.util.concurrent.ExecutionException; import org.apache.http.client.utils.CloneUtils;
import org.springframework.beans.factory.InitializingBean; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; /**
* 〈一句话功能简述〉<br>
* guava内存缓存基类
*
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public abstract class AbstractMemoryCache<PK, T> implements InitializingBean { private LoadingCache<PK, T> cache; protected abstract CacheBuilder<Object, Object> getCacheBuilder(CacheBuilder<Object, Object> cacheBuilder); protected abstract CacheLoader<PK, T> getCacheLoader(); protected LoadingCache<PK, T> getCache() {
return cache;
} public T getValue(PK pk) throws Exception {
try {
return CloneUtils.cloneObject(this.cache.get(pk));
} catch (CloneNotSupportedException | ExecutionException e) {
throw new Exception(e);
}
} public void setValue(PK pk, T t) {
this.cache.put(pk, t);
} @Override
public void afterPropertiesSet() throws Exception {
CacheLoader<PK, T> cacheLoader = this.getCacheLoader();
CacheBuilder<Object, Object> cacheBuilder = this.getCacheBuilder(CacheBuilder.newBuilder());
this.cache = cacheBuilder.build(cacheLoader);
} }
InitializingBean接口为spring提供的一个接口,用来加载保存数据,可打开源码看下,通过注释可了解到该接口主要用来初始化加载数据:
package org.springframework.beans.factory; /**
* Interface to be implemented by beans that need to react once all their
* properties have been set by a BeanFactory: for example, to perform custom
* initialization, or merely to check that all mandatory properties have been set.
*
* <p>An alternative to implementing InitializingBean is specifying a custom
* init-method, for example in an XML bean definition.
* For a list of all bean lifecycle methods, see the BeanFactory javadocs.
*
* @author Rod Johnson
* @see BeanNameAware
* @see BeanFactoryAware
* @see BeanFactory
* @see org.springframework.beans.factory.support.RootBeanDefinition#getInitMethodName
* @see org.springframework.context.ApplicationContextAware
*/
public interface InitializingBean { /**
* Invoked by a BeanFactory after it has set all bean properties supplied
* (and satisfied BeanFactoryAware and ApplicationContextAware).
* <p>This method allows the bean instance to perform initialization only
* possible when all bean properties have been set and to throw an
* exception in the event of misconfiguration.
* @throws Exception in the event of misconfiguration (such
* as failure to set an essential property) or if initialization fails.
*/
void afterPropertiesSet() throws Exception; }
第2步:实现基类,封装业务数据保存和调用
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import org.springframework.stereotype.Component; /**
* 〈一句话功能简述〉<br>
* 〈缓存〉
*
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
* @date 20190807
*/
@Component("tokenCache")
public class TokenCache extends AbstractMemoryCache<String, Map<String, Object>> { // 过期时间: 3小时
private static final int EXPIRE_SEC_TIME = 3; // 最多保存的key的数量
private static final int MAX_KEY_SIZE = 500;
·
·// 设置存储数量和过期时间
@Override
protected CacheBuilder<Object, Object> getCacheBuilder(CacheBuilder<Object, Object> cacheBuilder) {
return cacheBuilder.maximumSize(MAX_KEY_SIZE).expireAfterWrite(EXPIRE_SEC_TIME, TimeUnit.HOURS);
} @Override
protected CacheLoader<String, Map<String, Object>> getCacheLoader() {
return new CacheLoader<String, Map<String, Object>>() { @Override
public Map<String, Object> load(String key) throws Exception {
return new HashMap<>();
}
};
}
// 根据key获取token值
public Object genToken(String key) throws Exception { return super.getValue(key).get(key);
}
// 在guava中根据key缓存值
public void setCache(String key,Object token) {
Map<String, Object> tokenMap = new HashMap<>();
tokenMap.put(key, token);
super.setValue(key, tokenMap);
}
}
设置过期时间
在构建Cache对象时,可以通过CacheBuilder类的expireAfterAccess和expireAfterWrite两个方法为缓存中的对象指定过期时间,使用`CacheBuilder`构建的缓存不会“自动”执行清理和逐出值,也不会在值到期后立即执行或逐出任何类型。相反,它在写入操作期间执行少量维护,或者在写入很少的情况下偶尔执行读取操作。其中,expireAfterWrite方法指定对象被写入到缓存后多久过期,expireAfterAccess指定对象多久没有被访问后过期。
第三步调用:由于在第二步类上加了spring的@Component注解,在服务启动时会自动加载到服务中,当做bean正常调用即可。
具体学习可参考以下博客:
Guava Cache用法介绍
Guava缓存工具类封装和使用的更多相关文章
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- Guava 常用工具类
引入guava包: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...
- Redis操作Set工具类封装,Java Redis Set命令封装
Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...
- Redis操作List工具类封装,Java Redis List命令封装
Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...
- Redis操作Hash工具类封装,Redis工具类封装
Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
- Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 内存缓存LruCache和磁盘缓存DiskLruCache的封装类,主要用于图片缓存. 效果图 代码分析 内存缓存LruCache和 ...
- 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Caching; usi ...
- SpringBoot Redis工具类封装
1.接口类 package com.sze.redis.util; import java.util.List; import java.util.Set; import java.util.conc ...
- php 缓存工具类 实现网页缓存
php 缓存工具类 实现网页缓存 php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存 一.文件缓存 二.数据查询结果缓存,使用内存来实现高速缓存 本 ...
随机推荐
- 【笔记整理】request模块基本使用
基本使用 发送get请求.获取响应各种请求.响应信息 def fun1(): url = "http://www.baidu.com" resp = requests.get(ur ...
- Educational Codeforces Round 159 总结
最失败的一集. C 开题顺序搞错,不小心先开了C,以为是A.还好C不难. 题意大概是在给定的数组最后添一个数(所有数两两不同),再自定义一个数 \(k\) ,数组中每个数可以加上若干个 \(k\) , ...
- Aware依赖注入管理
1.Aware介绍 在Spring当中有一些内置的对象是未开放给我们使用的,例如Spring的上下文ApplicationContext.环境属性Environment,BeanFactory等等其他 ...
- Linux系统快速入门
LINUX基础知识 I.Linux概述 linux是啥? 一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Un ...
- NebulaGraph实战:1-NebulaGraph安装和基础操作
以前使用Neo4j图数据库,考虑到生产环境需要最终选择了NebulaGraph图数据库.对于数据要求比较高的领域,比如医疗.财务等,暂时还是离不开知识图谱的.后面主要围绕LLM+KG做一些行业解决 ...
- ROMA Connect: 5大联接能力+4大集成能力,推进企业数字化转型
摘要:ROMA Connect是一个全栈式的应用与数据集成平台,源自华为数字化转型集成实践,聚焦应用和数据连接,适配多种企业常见的使用场景. 本文分享自华为云社区<数据融合集成平台ROMA Co ...
- DTT年度收官圆桌π,华为云8位技术专家的年末盘点
摘要:收下这份DTT年度收官圆桌π总结,在新的一年心想事成,技术上更上一层楼. 本文分享自华为云社区<DTT年度收官圆桌π,华为云8位技术专家的年末盘点>,作者:华为云社区精选 . 在20 ...
- ISO/IEC 5055:软件代码质量的标尺
摘要:ISO 5055是首个直接从软件内部结构方面衡量软件质量(如安全性和可靠性)的ISO标准.该标准基于统计安全性.可靠性.可维护性和性能效率方面的软件缺陷来衡量软件的结构质量. 本文分享自华为云社 ...
- 五一高铁票难抢?用RPA机器人试试!
随着信息数字化的高速发展,RPA在各行业中得到广泛应用,热度大增.这匹"技术黑马"已然成为构建业务流程自动化的重要引擎之一,助力企业组织向"智能自动化转型. 什么是RPA ...
- 小白必看!JS中循环语句大集合
摘要:JavaScript中,一共给开发者提供了一下几种循环语句,分别是while循环,do-while循环,for循环,for Each,for-in循环和for-of循环. 本文分享自华为云社区& ...