带你读《2022技术人的百宝黑皮书》——谈一谈凑单页的那些优雅设计(2)

简介: 带你读《2022技术人的百宝黑皮书》——谈一谈凑单页的那些优雅设计(2)

带你读《2022技术人的百宝黑皮书》——谈一谈凑单页的那些优雅设计(1)https://developer.aliyun.com/article/1338386?groupCode=taobaotech

下面来看看我是如何优化的。核心主要关注:区分下游返回的结果是真的空还是假的空,本身就为空的情况下,就该缓存空集合(非大促期间或者某些榜没有数据,数据本身就为空)

 

 

 

image.png

 

 

在redis中拉长value缓存的时间,同时新增一个可更新时间的缓存(比如60s过期),当判断更新时间缓存过期了,就重新读取数据源,将value值重新赋值,这里需要注意,我会对比新老数据,如果新数据为空,老数据不为空,则只是更新时间,不置换value。value随着自己的过期时间结束,改造后的代码如下:

  return LOCAL_CACHE.get(key, () -> {
  String updateKey = getUpdateKey(key);
  String value = rdbCommonTairCluster.get(key);
  List<ItemShow> cache = StringUtils.isBlank(cache) ? Collections.emptyList()
:  JSON.parseObject(value, new TypeReference<List<ItemShow>>(){});
  if (rdbCommonTairCluster.exists(updateKey)) {
  return cache;
 }
  rdbCommonTairCluster.set(updateKey, currentTime, cacheUpdateSecond);
  List<ItemShow> itemShows = getRankingItemOriginal(context, rankingRequest);
  if (CollectionUtils.isNotEmpty(itemShows)) {
   rdbCommonTairCluster.set(key, JSON.toJSONString(itemShows), new SetParams().ex(Common- Switch.rankingExpireSecond));
 }
 return itemShows;
 });

 

为了使这段代码能够复用,我将该多级缓存抽象出来一个独立对象,代码如下:

 

  public class GatherCache<V> {
@Setter
  private Cache<String, List<V>> localCache;
  @Setter
  private CenterCache centerCache; 6
public List<V> get(boolean needCache, String key, @NonNull Callable<List<V>> loader, Func- tion<String, List<V>> parse) {
try {
// 是否需要是否缓存
return needCache ? localCache.get(key, () -> getCenter(key, loader, parse)) : loader.call();
} catch (Throwable e) {
GatherContext.error(this.getClass().getSimpleName() + " get catch exception", e);
}
return Collections.emptyList();
}
private List<V> getCenter(String key, Callable<List<V>> loader, Function<String, List<V>> parse) throws Exception {
String updateKey = getUpdateKey(key); String value = centerCache.get(key);
boolean blankValue = StringUtils.isBlank(value);
List<V> cache = blankValue ? Collections.emptyList() : parse.apply(value); if (centerCache.exists(updateKey)) {
return cache;
}
centerCache.set(updateKey, currentTime, cacheUpdateSecond); List<V> newCache = loader.call();
if (CollectionUtils.isNotEmpty(newCache)) {
centerCache.set(key, JSON.toJSONString(newCache), cacheExpireSecond);
}
return newCache;
}
}

 

将从数据源获取数据的代码交与外部实现,使用Callable的形式,同时通过泛型约束数据源类型,这里还有一点瑕   疵还没得到解决,就是通过fastJson转换String到对象时,没法使用泛型直接转,我这里就采用了外部化的处理, 就是跟获取数据源方式一样,由外部来决定如何解析从redis中获取到的字符串value。调用方式如下:

 

 

 

  List<ItemShow> itemShowList = gatherCache.get(true, rankingRequest.getKey(),
  () -> getRankingItemOriginal(rankingRequest, context.getRequestContext()),
  v -> JSON.parseObject(v, new TypeReference<List<ItemShow>>() {}));


同时我还采用的建造者模式,方便gatherCache类快速生成,代码如下:

 

  @PostConstruct
  public void init() {
  this.gatherCache = GatherCacheBuilder.newBuilder()
  localMaximumSize(500)
  localExpireAfterWriteSeconds(30)
build(rdbCenterCache); 7 }

带你读《2022技术人的百宝黑皮书》——谈一谈凑单页的那些优雅设计(3)https://developer.aliyun.com/article/1338379?groupCode=taobaotech

相关文章
|
5月前
|
人工智能 监控 安全
告别传统Prompt写法!聚AI提示词工程新范式
本章系统讲解Python提示词工程实战,涵盖专业环境搭建、API调用与结构化响应、企业级模板引擎及多步骤对话管理,并延伸至Prompt迭代优化、外部工具集成与性能监控,助力构建工业级AI应用系统。(239字)
334 1
|
7月前
|
存储 机器学习/深度学习 人工智能
智慧商场的新基石:如何利用玩美移动 AI API 打造下一代“智能试妆镜”
在实体零售转型浪潮中,玩美移动(Perfect Corp.)推出AI虚拟试妆(VTO)解决方案,赋能商场试妆镜:通过云端S2S工作流、亚像素级五官追踪与物理级妆效还原,实现非接触式、高拟真、全渠道一致的沉浸试妆体验,助力品牌提升转化与数据运营。(239字)
473 1
智慧商场的新基石:如何利用玩美移动 AI API 打造下一代“智能试妆镜”
|
10月前
|
API
【剪映小助手】获取音频文件的时长
获取音频文件的时长,支持各种常见的音频格式。使用FFprobe工具进行精确的音频分析,返回音频文件的准确时长,单位为微秒。
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
人工智能 算法 安全
人工智能伦理与监管:构建负责任的AI未来
【10月更文挑战第3天】随着人工智能(AI)技术的快速发展,其在社会各领域的应用日益广泛。然而,AI的广泛应用也带来了一系列伦理和监管挑战。本文旨在探讨AI的伦理问题,分析现有的监管框架,并提出构建负责任AI未来的建议。同时,本文将提供代码示例,展示如何在实践中应用这些原则。
2321 1
|
人工智能 自然语言处理 JavaScript
【CodeBuddy】三分钟开发一个实用小功能之:字体阴影实时预览工具
CodeBuddy是一款革命性AI编程助手,通过自然语言描述快速生成可运行代码。本文以实时更新文字阴影效果的交互界面为例,展示其智能上下文理解、全链路生成等核心功能。应用场景涵盖原型开发、教学辅助及日常提效,未来还将支持多模态交互与个性化风格。附完整HTML/CSS/JS代码,助开发者专注创意实现。
583 2
【CodeBuddy】三分钟开发一个实用小功能之:字体阴影实时预览工具
|
机器学习/深度学习 算法
常用的PID有哪些?
常用的PID有哪些?
1461 1
常用的PID有哪些?
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
数据可视化 定位技术 API
Python pyecharts 模块
Python pyecharts 模块
|
Kubernetes 安全 数据安全/隐私保护
云卓越架构:容器安全最佳实践
本次分享由阿里云智能集团解决方案架构师张玉峰主讲,主题为“云卓越架构:容器安全最佳实践”。内容涵盖容器安全的挑战、云原生容器安全架构及典型场景。首先分析了容器安全面临的问题,如镜像漏洞和权限管理。接着介绍了容器安全架构的五个维度:身份权限管理、配置安全检查、运行时防护、镜像安全检测及发布的安全管控。最后通过具体场景展示了容器身份与权限管理、密钥管理、运行时防入侵等最佳实践,强调了安全左移的重要性,确保从开发到运行的全生命周期安全覆盖。

热门文章

最新文章