常见类型
客户端缓存
页面浏览器缓存、app缓存、h5缓存
CDN缓存
内容存储、内容分发(负载均衡)
nginx缓存
静态资源
服务端缓存
本地缓存(map/list)、外部缓存(redis...)
数据库缓存
持久层缓存(mybatis多级缓存)、查询缓存
操作系统缓存
page cache、buffer cache
过期策略
定时过期
每个key都需要创建一个定时器,对内存友好,但消耗cpu资源
惰性过期
访问一个key时才判断该key是否过期过期则清除,节省cpu资源但占用内存
定期过期
每隔一定时间,会扫描一定数量的数据库的expires字典中一定数量的key(随机)(折中方案)
优化方案
分桶策略
淘汰算法
FIFO--先进先出
根据缓存存储时间,离当前最远数据优先淘汰
LRU--最近最少使用
最近使用的时间,离当前最远数据优先淘汰
LFU--最不经常使用
一段时间内,缓存数据用的最少优先淘汰
注:当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下 降,缓存污染情况比较严重。这时使用LFU可能更好点。
使用场景
- 热点商品详情页
- 热搜
- 热门帖子
- 热门用户主页
注:一般在高并发场景下
常见问题
本地缓存优缺点
使用本地缓存好处:
- 减少网络请求提高性能
- 分布式系统中,天然分布式缓存
- 减少远程缓存压力
使用本地缓存缺点:
- 进程空间大小有限,不支持大数据量存储
- 重启程序会丢失数据
- 分布式场景下,系统之间数据可能存在不一致
- 和远地缓存可能存在不一致