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

相关文章
|
人工智能 算法 安全
人工智能伦理与监管:构建负责任的AI未来
【10月更文挑战第3天】随着人工智能(AI)技术的快速发展,其在社会各领域的应用日益广泛。然而,AI的广泛应用也带来了一系列伦理和监管挑战。本文旨在探讨AI的伦理问题,分析现有的监管框架,并提出构建负责任AI未来的建议。同时,本文将提供代码示例,展示如何在实践中应用这些原则。
2154 1
|
Oracle 关系型数据库 数据库
flashback实现数据快速复原
【11月更文挑战第1天】Flashback 技术是 Oracle 数据库提供的一种数据恢复机制,允许用户快速将数据库对象恢复到过去某个时间点或系统变更号(SCN)的状态。主要功能包括 Flashback Table(表级恢复)、Flashback Query(查询历史数据)和 Flashback Database(数据库级恢复)。通过这些功能,用户可以在不使用传统备份恢复方法的情况下,高效地恢复数据。例如,使用 `FLASHBACK TABLE` 语句可以将表恢复到指定时间点,而 `FLASHBACK QUERY` 则允许查询历史数据。
634 2
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
Kubernetes 关系型数据库 分布式数据库
kubeblocks完成阿里云PolarDB数据库产品生态集成认证
近日,杭州云猿生数据有限公司(以下简称云猿生)与阿里云PolarDB 开源数据库社区展开产品集成认证。测试结果表明,杭州云猿生数据有限公司旗下kubeblocks(V0.7.0)与阿里云以下产品:开源云原生数据库PolarDB 分布式版( V2.0 ),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
机器学习/深度学习 自然语言处理
序列到序列(Seq2Seq)模型
序列到序列(Seq2Seq)模型
855 8
|
关系型数据库 分布式数据库 数据库
PolarDB操作报错合集之遇到报错:Exception in thread "main" java.lang.NoClassDefFoundError: jpcap/JpcapCaptor,该怎么解决
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
394 1
|
前端开发 JavaScript UED
现代前端开发中的动态组件加载与性能优化
传统的前端应用加载所有组件可能会导致性能问题和用户体验下降。本文讨论了现代前端开发中采用动态组件加载的策略,通过异步加载和按需渲染优化页面加载速度和资源利用效率。
|
中间件 数据挖掘 API
ERP系统的系统集成与接口管理:实现高效协同
【7月更文挑战第29天】 ERP系统的系统集成与接口管理:实现高效协同
1364 0
|
XML Java Android开发
Android 开发中原始音频的录播和和自定义音频控制条的讲解及实战(超详细 附源码)
Android 开发中原始音频的录播和和自定义音频控制条的讲解及实战(超详细 附源码)
273 0
|
人工智能 图形学
【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏2(附项目源码)
【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏2(附项目源码)
260 0