架构师如何掌握本地缓存原理及其广泛应用?
摘要:先说结论:本地缓存优先选用caffeine,因为性能比guava cache快,api风格与之兼容、能轻松地平滑迁移,并且在springspring boot最新版本中已经是默认本地缓存了。下面展开讲讲本地缓存和Spring cache。
先说结论:本地缓存优先选用caffeine,因为性能比guava cache快,api风格与之兼容、能轻松地平滑迁移,并且在spring/spring boot最新版本中已经是默认本地缓存了。下面展开讲讲本地缓存和Spring cache。
本文讨论堆内缓存,暂不讨论堆外缓存。堆内缓存是指缓存与应用程序在一个JVM应用中,会受GC影响,一般业务层面的应用开发用不到堆外缓存。
1、什么场景使用本地缓存
并非所有的缓存场景,redis都适用,以下情况应当优先考虑本地缓存。
数据量不大
修改频率低、甚至是静态的数据
查询qps极高:通过纯内存操作,避免网络请求
对性能有极致要求,速度比redis更快
如:秒杀热点商品缓存、地域信息缓存。
2、缓存基本原理
先简单回顾一下缓存的基本原理。
语义
get:根据key查询value,缓存未命中时查询底层数据并设置缓存
put:设置缓存
evict:删除key
ttl:kv键值对的存活时长
淘汰策略
缓存有大小上限,超过后需要淘汰掉冷数据,保留真正的热数据,以确保缓存命中率。有2种常见算法:LRU和LFU。
LRU(Least Recently Used)
优先淘汰掉最近最少使用的数据,该算法假设最近访问的数据,将来也会频繁地使用。
优点
容易理解和实现
链表占用空间小
缺点
临时批量数据,会把真正的热数据冲掉,而造成缓存命中率急剧下降,影响性能
下面给出LRU算法的2种伪代码实现:
LinkedHashMap实现:LinkedHashMap底层数据结构就是一个HashMap和双向链表的结合体,可以借助它快速实现LRU算法。
