当前位置: 首页 > wzjs >正文

专业个人网站建设手机网站建设介绍

专业个人网站建设,手机网站建设介绍,百度指数的数据怎么导出,长辛店镇网站建设一、场景背景 在系统开发中,字典数据(如状态类型、分类数据)具有以下特点: 高频读取(每个请求都可能涉及)低频变化(管理员修改后才会变更)数据一致性要求适中(允许分钟…

一、场景背景

在系统开发中,字典数据(如状态类型、分类数据)具有以下特点:

  • 高频读取(每个请求都可能涉及)
  • 低频变化(管理员修改后才会变更)
  • 数据一致性要求适中(允许分钟级延迟)
  • 传统方案每次查询数据库的方式会造成性能瓶颈,本文展示如何基于 Guava Cache 构建缓存层。

二、技术选型分析

为什么选择 Guava Cache?

  • 轻量级:无需引入 Redis 等中间件
  • 自动加载:提供 LoadingCache 自动回源能力
  • 灵活策略:支持基于时间/权重的淘汰策略
  • 线程安全:内置并发控制机制

三、实战代码解析

1.相关代码文件

KeyValue

@Data
@NoArgsConstructor
@AllArgsConstructor
public class KeyValue<K, V> implements Serializable {private K key;private V value;}

CacheUtils

public class CacheUtils {// 异步刷新缓存(适合全局数据)public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {return CacheBuilder.newBuilder().refreshAfterWrite(duration) // 写后刷新时间.build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool()));}// 同步刷新缓存(适合用户关联数据)public static <K, V> LoadingCache<K, V> buildCache(Duration duration, CacheLoader<K, V> loader) {return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader);}
}

DictFrameworkUtils

public class DictFrameworkUtils {private static DictDataApi dictDataApi;private static final DictDataRespDTO DICT_DATA_NULL = new DictDataRespDTO();/*** 针对 {@link #getDictDataLabel(String, String)} 的缓存*/private static final LoadingCache<KeyValue<String, String>, DictDataRespDTO> GET_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache(Duration.ofMinutes(1L), // 过期时间 1 分钟new CacheLoader<KeyValue<String, String>, DictDataRespDTO>() {@Overridepublic DictDataRespDTO load(KeyValue<String, String> key) {return ObjectUtil.defaultIfNull(dictDataApi.getDictData(key.getKey(), key.getValue()), DICT_DATA_NULL);}});/*** 针对 {@link #getDictDataLabelList(String)} 的缓存*/private static final LoadingCache<String, List<String>> GET_DICT_DATA_LIST_CACHE = CacheUtils.buildAsyncReloadingCache(Duration.ofMinutes(1L), // 过期时间 1 分钟new CacheLoader<String, List<String>>() {@Overridepublic List<String> load(String dictType) {return dictDataApi.getDictDataLabelList(dictType);}});/*** 针对 {@link #parseDictDataValue(String, String)} 的缓存*/private static final LoadingCache<KeyValue<String, String>, DictDataRespDTO> PARSE_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache(Duration.ofMinutes(1L), // 过期时间 1 分钟new CacheLoader<KeyValue<String, String>, DictDataRespDTO>() {@Overridepublic DictDataRespDTO load(KeyValue<String, String> key) {return ObjectUtil.defaultIfNull(dictDataApi.parseDictData(key.getKey(), key.getValue()), DICT_DATA_NULL);}});public static void init(DictDataApi dictDataApi) {DictFrameworkUtils.dictDataApi = dictDataApi;log.info("[init][初始化 DictFrameworkUtils 成功]");}@SneakyThrowspublic static String getDictDataLabel(String dictType, String value) {return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, value)).getLabel();}@SneakyThrowspublic static List<String> getDictDataLabelList(String dictType) {return GET_DICT_DATA_LIST_CACHE.get(dictType);}@SneakyThrowspublic static String parseDictDataValue(String dictType, String label) {return PARSE_DICT_DATA_CACHE.get(new KeyValue<>(dictType, label)).getValue();}}

2. 核心工具类封装(CacheUtils)

public class CacheUtils {// 异步刷新缓存(适合全局数据)public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {return CacheBuilder.newBuilder().refreshAfterWrite(duration) // 写后刷新时间.build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool()));}
}

关键配置说明:

  • refreshAfterWrite:写入后指定时间触发异步刷新
  • asyncReloading:使用独立线程池执行刷新任务
  • Executors.newCachedThreadPool:弹性线程池应对突发流量

3. 字典缓存实现(DictFrameworkUtils)

3.1 缓存初始化

   private static DictDataApi dictDataApi;private static final DictDataRespDTO DICT_DATA_NULL = new DictDataRespDTO();// 使用复合 Key 缓存字典项(类型+值 → 标签)private static final LoadingCache<KeyValue<String, String>, DictDataRespDTO> GET_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache(Duration.ofMinutes(1L), // 过期时间 1 分钟new CacheLoader<KeyValue<String, String>, DictDataRespDTO>() {@Overridepublic DictDataRespDTO load(KeyValue<String, String> key) {return ObjectUtil.defaultIfNull(dictDataApi.getDictData(key.getKey(), key.getValue()), DICT_DATA_NULL);}});

3.2 缓存使用示例

@SneakyThrows // 通过 Lombok 隐藏异常
public static String getDictDataLabel(String dictType, String value) {return GET_DICT_DATA_CACHE.get(new KeyValue<>(dictType, value)).getLabel();
}

四、最佳实践总结

1. 缓存策略设计

策略说明本案例实现
缓存穿透非法 Key 导致频繁回源返回 DICT_DATA_NULL 空对象
缓存雪崩大量缓存同时失效随机过期时间(可扩展)
缓存击穿热点 Key 失效导致并发回源使用 LoadingCache 原子加载

2. 性能优化点

  • 异步刷新:通过 asyncReloading 实现后台线程刷新,避免阻塞请求线程
  • 分层缓存:同时缓存 字典项 → 标签 和 标签 → 字典项 两种关系
  • 弹性线程池:使用 CachedThreadPool 应对突发刷新请求
http://www.dtcms.com/wzjs/550868.html

相关文章:

  • 清丰网站建设电话手机怎么跳过国家禁止访问
  • 网站 页面 结构wordpress默认主题页脚
  • 宜昌市夷陵区建设局网站wordpress里如何添加ALT标签
  • 如何做网站开屏企业网站开发实训目的和意义
  • 济南建设高端网站俄罗斯服务器网站
  • 效益型网站那个网站招丑的人做网红
  • 小学生家长网站建设需求国外好用的免费服务器
  • 重庆网站建设 公司网站结构形式有哪些
  • 网站模板制作与安装教程视频教程8+1网站正能量直接入口没封
  • 网站续费自己做美食烹饪网站策划书
  • 做个网站要钱吗网站建设规划书目录
  • 网站分销系统将一个网站拉入黑名单怎么做
  • 天津免费建网站新吁网站建设
  • 网站建设基本流程 dns体育西网站开发设计
  • 代帮企业做网站最好的购物网站
  • 贵阳建网站公司西宁做网站
  • 网站备案详细流程wordpress 安装数据库
  • 农业银行总行门户网站建设好多商城app
  • 广东外贸网站建设怎么买网站
  • 东莞网站托管公司电商网站建设的步骤
  • 门户网站建设投资昆山智能网站建设
  • 企业网站介绍html做网站需要服务器吗
  • 网站建设全程揭秘pdfjs特效网站欣赏
  • wap的网站模板下载网站做优化需要多少钱
  • 做外围的都上什么网站找广州公司注册多久时间
  • 湖北荆门建设银行网站小说网站80电子书怎么做
  • html5高端红色织梦网络公司网站北京app网站开发
  • 做网站推广的技巧wordpress时光轴模板
  • 网站建设需要懂什么软件余姚市建设局网站
  • 网站建设工作室07fly广安发展建设集团门户网站