文章目录加载中

缓存设计-基础学习笔记

# 什么样的数据需要缓存?

  1. 经常读取、频繁访问的数据
  2. 热点数据
  3. 会造成 I/O 瓶颈的数据:比如慢查询结果、远程调用结果
  4. 计算昂贵的数据:比如聚合结果

# 怎么衡量缓存质量?

一般是通过“缓存命中率”来衡量缓存是否工作良好。

云开发 CloudBase 网关之前只有堆上缓存,假设集群有 N 个 Pod,并且 N 远大于 60,那么对于同一个用户,当 1min 请求不到 60 次,请求就会均匀落到各个 Pod,那么堆上缓存其实是无用的。当时缓存命中率在 40%左右,链路耗时也较高(因为缓存没共享,每次都要重新计算)。

解决方法是实现分布式多级缓存:redis+local+LRU。优化后,缓存命中率达到 99%。

# 常见缓存策略

  1. 基于空间:缓存占用的存储空间
  2. 基于容量:缓存总数
  3. 基于时间:过期时间、空闲期(多久没访问后,移除)
  4. 回收算法:
    • FIFO:先进先出
    • LRU:最近最少使用算法(最常用)
    • LFU:最不常用算法,一定时间内使用次数(频率)最少的那个被移除

# 常见的缓存实践模式

  • Cache Aside:代码里面直接维护缓存的逻辑,比如缓存不命中,再调用后台接口请求缓存,再调用接口刷新缓存结果到本地和 redis。
  • Cache as SoR:抽象一层缓存层,开发者只需要通过缓存层接口读取/写数据即可,缓存层内部封装了默认值判断、缓存过期判断、异步请求等逻辑
    • Read Through:业务调用 cache 层,cache 层不命中,内部自动回源 Source
    • Write Through:业务调用 cache 层修改数据,cache 层内部去更新缓存和 Source
    • Write Aside:Write Through 的异步模式,降低耗时,快速返回结果

注:只是一些术语,本质上就是是否抽出一个缓存层,用来代理开发者操作,降低开发和维护成本。

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