文章目录加载中

缓存设计-多级缓存设计(分布式)

# 为什么需要多级缓存?

在云开发网关中,缓存层的设计至关重要。

最初,缓存是放在堆上的本机缓存。基本策略是 LRU,过期支持异步续期。

假设集群中有 60 个 pod,采取普通轮询的方式分配流量,缓存有效期是 60s。用户每分钟请求少于 60 个,就会落到不同的 pod 上,不会命中缓存。对于用户,每次请求都很慢。随着集群上 workload 中 pod 的增多,缓存命中率只会越来越低,平均耗时越来越高。

除此之外,重启 pod 会造成缓存丢失,当然这个不如命中率低影响大。

# 多级缓存逻辑设计

缓存层是一个逻辑上的概念,由多个部分的缓存共同组成:

  • 进程(堆上)缓存
  • 分布式 redis 缓存中心

在读取缓存的时候,对于没有命中缓存的情况,会自动降级读取。具体如下:

  • 出于速度和一致性的考虑,首先读取进程缓存
  • 进程缓存没命中,则读取 redis 缓存中心的缓存数据
  • redis 缓存中心不命中,则异步请求数据,并将异步刷新缓存

相对地,缓存刷新策略如下:

  • 异步获取的数据先存储到进程缓存
  • 再存到 redis 缓存中心

其他还有一些小细节,比如 redis js 库的超时设置有时会“抽风”,更稳健的做法是在代码中使用setTimeout,超时则 Promise.reject,主动结束请求;比如可以加入默认值的设计等等。

本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog