文章目录加载中
缓存设计-基础学习笔记
# 什么样的数据需要缓存?
- 经常读取、频繁访问的数据
- 热点数据
- 会造成 I/O 瓶颈的数据:比如慢查询结果、远程调用结果
- 计算昂贵的数据:比如聚合结果
# 怎么衡量缓存质量?
一般是通过“缓存命中率”来衡量缓存是否工作良好。
云开发 CloudBase 网关之前只有堆上缓存,假设集群有 N 个 Pod,并且 N 远大于 60,那么对于同一个用户,当 1min 请求不到 60 次,请求就会均匀落到各个 Pod,那么堆上缓存其实是无用的。当时缓存命中率在 40%左右,链路耗时也较高(因为缓存没共享,每次都要重新计算)。
解决方法是实现分布式多级缓存:redis+local+LRU。优化后,缓存命中率达到 99%。
# 常见缓存策略
- 基于空间:缓存占用的存储空间
- 基于容量:缓存总数
- 基于时间:过期时间、空闲期(多久没访问后,移除)
- 回收算法:
- 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