上海网站建设300,淮南网站优化,莆田网站建设设计,公司网站内容模块布局【实用工具类】基于Guava Cache实现通用Token缓存工具类#xff08;附完整源码#xff09;
在日常开发中#xff0c;Token缓存是非常常见的场景——比如接口调用的访问令牌、用户登录态Token、第三方服务的临时凭证等。如果每次使用Token都重新生成/请求#xff0c;会增加…【实用工具类】基于Guava Cache实现通用Token缓存工具类附完整源码在日常开发中Token缓存是非常常见的场景——比如接口调用的访问令牌、用户登录态Token、第三方服务的临时凭证等。如果每次使用Token都重新生成/请求会增加系统开销而手写缓存又容易出现重复造轮子、边界处理不完整的问题。今天给大家分享一个基于Guava Cache实现的通用Token缓存工具类支持泛型、自定义配置、自动刷新、失效监听等核心能力开箱即用适配绝大多数Token缓存场景。一、核心特性这个TokenCache工具类具备以下核心优势✅泛型支持适配任意类型的TokenString、自定义对象、整数等无需重复编写缓存逻辑✅灵活配置支持自定义缓存最大容量、过期时间、并发级别满足不同场景需求✅自动刷新获取Token时若不存在/已过期自动触发刷新逻辑无需手动判断✅失效监听缓存失效时可监听并打印原因便于问题排查✅便捷操作封装了存、取、失效、清空、统计等常用方法调用简单。二、完整源码先贴出完整的工具类源码建议直接收藏备用packagecom.dolphin.util;importcom.google.common.cache.Cache;importcom.google.common.cache.CacheBuilder;importcom.google.common.cache.RemovalListener;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.TimeUnit;/** * 支持泛型的Token缓存类基于Guava Cache实现 * 提供Token的存储、获取、自动刷新和失效等功能 */publicclassTokenCacheT{// 基于LRU淘汰策略的核心缓存对象privatefinalCacheString,TtokenCache;// 默认构造函数最大容量1000写入后30分钟过期并发级别16publicTokenCache(){this(1000,1800,TimeUnit.SECONDS,16);}/** * 自定义配置的构造函数 * * param maxSize 最大缓存数量LRU淘汰阈值 * param expireSeconds 过期时间写入后多久过期 * param timeUnit 时间单位 * param concurrencyLevel 并发级别同时写缓存的线程数 */publicTokenCache(intmaxSize,intexpireSeconds,TimeUnittimeUnit,intconcurrencyLevel){this.tokenCacheCacheBuilder.newBuilder()// LRU核心缓存达到最大容量时淘汰最少使用的缓存.maximumSize(maxSize)// 写入后过期区别于访问后过期适合Token这类有固定有效期的场景.expireAfterWrite(expireSeconds,timeUnit)// 并发级别控制缓存分段数提升多线程读写性能.concurrencyLevel(concurrencyLevel)// 失效监听器打印失效的Key和原因便于排查问题.removalListener((RemovalListenerString,T)notification-System.out.println(Token失效notification.getKey()原因notification.getCause())).build();}/** * 存入/更新Token覆盖式 * param key 缓存Key建议按业务规则命名如user_1_token、api_access_token * param token 缓存的Token对象 */publicvoidputToken(Stringkey,Ttoken){tokenCache.put(key,token);}/** * 普通获取Token不存在/已过期返回null * param key 缓存Key * return 缓存的Token无则返回null */publicTgetToken(Stringkey){returntokenCache.getIfPresent(key);}/** * 带自动刷新的Token获取 * 若Key不存在/已过期自动执行refreshLogic生成新Token并缓存 * param key 缓存Key * param refreshLogic Token刷新逻辑Callable接口支持抛出异常 * return 最新的Token */publicTgetTokenWithRefresh(Stringkey,CallableTrefreshLogic){try{returntokenCache.get(key,refreshLogic);}catch(ExecutionExceptione){Throwablecausee.getCause();// 解包RuntimeException避免外层捕获冗余异常if(causeinstanceofRuntimeException){throw(RuntimeException)cause;}thrownewRuntimeException(Token刷新失败,cause);}}/** * 强制失效指定Token * param key 缓存Key */publicvoidinvalidateToken(Stringkey){tokenCache.invalidate(key);}/** * 获取当前缓存大小 * return 缓存中的有效Key数量 */publiclongsize(){returntokenCache.size();}/** * 清空所有缓存 */publicvoidinvalidateAll(){tokenCache.invalidateAll();}}三、核心代码解析1. 依赖说明该工具类基于Guava Cache实现需先引入Guava依赖Maven示例!-- Guava --dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion32.1.3-jre/version!-- 建议使用最新稳定版 --/dependency2. 关键设计解析LRU淘汰策略通过maximumSize设置最大容量当缓存达到阈值时自动淘汰最少使用的Token避免内存溢出过期策略使用expireAfterWrite写入后过期适合Token这类“生成后有固定有效期”的场景若需“访问后过期”可替换为expireAfterAccess泛型设计类定义TokenCacheT使得缓存可以存储任意类型的Token字符串、自定义Token对象、整数等自动刷新getTokenWithRefresh方法结合Callable实现“懒加载自动刷新”无需手动判断Token是否有效失效监听removalListener监听缓存失效事件可扩展为记录日志、发送告警、清理关联数据等。四、使用示例下面通过完整示例演示工具类的核心用法publicclassTokenCacheExample{publicstaticvoidmain(String[]args){// 1. 创建默认配置的字符串类型Token缓存TokenCacheStringstringCachenewTokenCache();// 2. 存储TokenstringCache.putToken(user1_token,abc123456);// 3. 普通获取TokenStringtokenstringCache.getToken(user1_token);System.out.println(普通获取Token: token);// 输出abc123456// 4. 带自动刷新的获取Token不存在则执行刷新逻辑StringnewTokenstringCache.getTokenWithRefresh(user2_token,()-{// 此处可替换为实际的Token生成逻辑如调用接口获取新Tokenreturnnew_token_System.currentTimeMillis();});System.out.println(自动刷新后获取Token: newToken);// 输出new_token_17xxxxxxxxx// 5. 强制失效TokenstringCache.invalidateToken(user1_token);System.out.println(失效后获取Token: stringCache.getToken(user1_token));// 输出null// 6. 自定义配置的缓存存储Integer类型最大容量5001小时过期并发级别8TokenCacheIntegerintCachenewTokenCache(500,3600,TimeUnit.SECONDS,8);intCache.putToken(counter,100);System.out.println(整数类型Token: intCache.getToken(counter));// 输出100// 7. 获取缓存大小System.out.println(缓存大小: intCache.size());// 输出1// 8. 清空所有缓存intCache.invalidateAll();System.out.println(清空后缓存大小: intCache.size());// 输出0}}五、注意事项与扩展建议1. 适用场景该工具类基于本地缓存Guava Cache适合单机/低并发场景的Token缓存若为分布式系统建议结合Redis实现分布式缓存可基于该工具类扩展Redis适配层。2. 配置优化maximumSize根据业务场景设置避免过大导致内存占用过高过小导致频繁淘汰expireAfterWrite建议与Token的实际有效期匹配如第三方Token有效期1小时缓存过期时间可设为55分钟预留刷新时间concurrencyLevel默认16多核CPU场景可适当调大如32但不宜过大会增加分段开销。3. 扩展方向失效监听增强将System.out.println替换为日志框架如SLF4J记录失效详情异常处理扩展针对getTokenWithRefresh的刷新逻辑增加重试机制缓存统计开启Guava Cache的统计功能recordStats()监控缓存命中率、失效次数等自定义过期策略结合业务实现更复杂的过期规则如不同Key设置不同过期时间。六、总结这个TokenCache工具类封装了Guava Cache的核心能力通过泛型和便捷的API设计解决了Token缓存的通用场景需求。代码简洁、易扩展可直接集成到项目中减少重复开发成本。如果你的项目中有Token缓存的需求不妨试试这个工具类也欢迎在评论区交流优化建议~ 本文源码已亲测可运行如需更多Guava Cache高级用法可参考官方文档Guava Cache官方指南