缓存的设计和使用
-
1、缓存的收益与成本
-
收益
-
1、加速读写:通过缓存加速读写速度:
CPU L1/L2/L3 Cache 、Linux page Cache
加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果。 -
2、降低后端的负载:业务端使用redis降低后端MySQL负载等。
-
-
成本
-
1、 数据不一致: 缓存层和数据层有时间窗口不一致,和更新策略有关。
-
2、代码维护成本:多了一层缓存逻辑。
-
3、运维成本: 例如 redis cluster
-
-
使用场景
-
1、对高消耗的SQL: join结果集/分组统计结果缓存。
-
2、加速请求响应
- 1、利用redis/Memcache优化IO响应时间。
-
3、大量写合并为批量写
- 1、如计数器先redis累加再批量写DB。
-
-
收益
-
2、缓存更新策略
-
1、LRU/LFU/FIFO算法剔除: 例如maxmemory-policy。
-
2、超时剔除:例如expire过期数据的删除。
-
3、主动更新:开发控制生命周期。
image -
建议:
-
1、低一致性:最大内存和淘汰策略。
-
2、高一致性:超时剔除和主动更新结合,最大内存和淘汰策略兜底。
-
-
-
3、缓存粒度问题
image- 缓存粒度控制- 三个角度
-
1、通用性:全量属性更好。
-
2、占用空间:部分属性更好。
-
3、代码维护:表面上全量属性更好。
-
- 缓存粒度控制- 三个角度
-
4、缓存穿透 - 大量请求不命中
image-
1、业务代码自身问题。
-
2、恶意攻击、爬虫等等。
如何发现问题
- 1、业务的相应时间。 - 2、业务本身问题。 - 2、相关指标: 总调用数,缓存层命中数、存储层命中数。
如何解决问题
-
1、缓存空值的问题
对于空数据,要设置过期时间。
image -
2、布隆过滤器拦截
-
145天以来,Java架构更新了 428个主题,已经有91位同学加入。微信扫码关注java架构,获取Java面试题和架构师相关题目和视频。上述相关面试题答案,尽在Java架构中。
网友评论