带你读《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

相关文章
|
数据采集 自然语言处理 前端开发
社区供稿 | 猎户星空百亿参数大模型 Orion-14B系列开源,一张3060就能跑(附魔搭社区推理微调最佳实践)
1月21日,傅盛在猎户星空大模型发布会上宣布,“为企业应用而生” 的开源百亿参数猎户星空大模型正式发布。猎户星空大模型(Orion-14B)是由猎户星空研发的预训练多语言大语言模型,以其140亿参数规模展现出了卓越的性能。
|
人工智能 算法 安全
人工智能伦理与监管:构建负责任的AI未来
【10月更文挑战第3天】随着人工智能(AI)技术的快速发展,其在社会各领域的应用日益广泛。然而,AI的广泛应用也带来了一系列伦理和监管挑战。本文旨在探讨AI的伦理问题,分析现有的监管框架,并提出构建负责任AI未来的建议。同时,本文将提供代码示例,展示如何在实践中应用这些原则。
2084 1
|
Oracle 关系型数据库 数据库
flashback实现数据快速复原
【11月更文挑战第1天】Flashback 技术是 Oracle 数据库提供的一种数据恢复机制,允许用户快速将数据库对象恢复到过去某个时间点或系统变更号(SCN)的状态。主要功能包括 Flashback Table(表级恢复)、Flashback Query(查询历史数据)和 Flashback Database(数据库级恢复)。通过这些功能,用户可以在不使用传统备份恢复方法的情况下,高效地恢复数据。例如,使用 `FLASHBACK TABLE` 语句可以将表恢复到指定时间点,而 `FLASHBACK QUERY` 则允许查询历史数据。
530 2
|
12月前
|
机器学习/深度学习 人工智能 算法
《探秘事件相关电位:人工智能与脑机交互的深度融合》
事件相关电位(ERP)是大脑对特定刺激的特异性响应,与人工智能结合,开启了脑机交互的新纪元。ERP通过EEG设备捕捉大脑信号,经多次叠加平均提取关键信息。AI算法如SVM和CNN助力特征提取与模式识别,实现对大脑活动的精准分析。基于ERP的脑机交互系统已在医疗康复、智能家居、娱乐等领域展现广泛应用前景。尽管面临个体差异、信号干扰等挑战,未来多学科交叉将推动技术突破,拓展应用领域,引领人机共生的新时代。
289 4
|
Kubernetes 安全 数据安全/隐私保护
云卓越架构:容器安全最佳实践
本次分享由阿里云智能集团解决方案架构师张玉峰主讲,主题为“云卓越架构:容器安全最佳实践”。内容涵盖容器安全的挑战、云原生容器安全架构及典型场景。首先分析了容器安全面临的问题,如镜像漏洞和权限管理。接着介绍了容器安全架构的五个维度:身份权限管理、配置安全检查、运行时防护、镜像安全检测及发布的安全管控。最后通过具体场景展示了容器身份与权限管理、密钥管理、运行时防入侵等最佳实践,强调了安全左移的重要性,确保从开发到运行的全生命周期安全覆盖。
|
机器学习/深度学习 资源调度 自动驾驶
OFDM:赋能5G通信的基石
OFDM:赋能5G通信的基石
1314 3
|
Kubernetes 关系型数据库 分布式数据库
kubeblocks完成阿里云PolarDB数据库产品生态集成认证
近日,杭州云猿生数据有限公司(以下简称云猿生)与阿里云PolarDB 开源数据库社区展开产品集成认证。测试结果表明,杭州云猿生数据有限公司旗下kubeblocks(V0.7.0)与阿里云以下产品:开源云原生数据库PolarDB 分布式版( V2.0 ),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引
在数据库管理和优化过程中,确认SQL查询是否使用了索引是一个至关重要的步骤
|
数据采集 运维 监控
如何保障业务稳定性?一文详解蚂蚁业务智能可观测平台BOS
本文将从可观测性视角出发,分析云上云下业务稳定性的难点,介绍蚂蚁集团的BOS平台是如何建设完善的解决方案来解决这些实际的痛点难点,并通过多个实践案例分享企业与机构如何利用BOS平台来实现云上云下全链路可观测性的需求。
736 0
如何保障业务稳定性?一文详解蚂蚁业务智能可观测平台BOS
|
前端开发