在高并发分布式应用中缓存从来都是必要的,而且从来都是综合应用本地缓存和分布式缓存提高性能的。
【1】本地缓存
本地缓存即缓存和应用在同一个进程里,是基于JVM的缓存,应用生则生,应用死则亡。
常见产品有Guava、Caffeine和Ehcache。三者对比如下:
对比项 | Guava | Caffeine | Ehcache |
是否开源 | Y(Google) | Y(apache) | Y(Terracotta) |
级别 | 轻量 | 轻量 | 重量级 |
知名度 | Java开发者必备 | Spring5 | Hibernate |
缓存算法 | LRU | W-TinyLFU | LRU、LFU FIFO |
JDK版本 | >=1.6 | >=1.8 | >=1.5 |
持久化支持 | 不支持 | 不支持 | 支持(商业) |
集群解决方案 | 无 | 无 | 有(商业) |
Spring Cache支持 | 不支持 | 支持 | 支持 |
性能监控 | 不带 | 不带 | 提供(JMX 页面) |
【2】分布式缓存
常见的有Redis、memcached。
二者具体对比如下:
【3】本地缓存VS分布式缓存
对比如下:
对比项 | 本地缓存 | 分布式缓存 |
概念 | 缓存和应用在同一个进程里,是基于JVM的缓存 | 单独的组件与应用分离 |
社区成熟 | 非常高 | 非常高 |
性能 | 很高 单机 | 高 需要TCP协议交互 |
黏度 | 紧耦合 | 松耦合 |
适用环境 | 单机 | 单机/集群环境 |
高可用 | 应用生则生,应用亡则亡 | 集群抱团 |
应用共享 | 不能共享 | 可以共享 |
【4】本地缓存VS分布式缓存VS数据库
使用不同方案获取50K数据进行10次测试对比表格如下:
缓存方式 | 数据总量 | 总响应时长(毫秒) | 第一次响应(毫秒) | 测试次数 | 平均响应时长 |
数据库中读取 | 50K | 83 | 12 | 10 | 8.3ms |
分布式缓存使用redis | 50K | 7 | 0.8 | 10 | 0.7ms |
本地应用缓存使用Guava | 50K | 0.133 | 0.011 | 10 | 0.013ms |
本地应用缓存直接使用map | 50K | 0.129 | 0.011 | 10 | 0.0129毫秒 |
【5】企业缓存常见方案
① 大型互联网企业如何选择缓存
一级缓存+分布式缓存+数据库集群:
② 常见缓存架构
如下表所示:
层级 | 常见产品 | 缓存解决方案 | 缓存技术 |
应用层 | 浏览器 | 浏览器缓存 本地缓存 | HTTP缓存协商 cookie sqlite websql |
网络层 | 网络路由 | CDN | Squid等 |
负载层 | Nginx Apache 等 | 动静分离 反向代理 | 基于Http服务器 |
服务层 | Java应用 PHP应用 | 动态页面静态化 应用缓存 分布式缓存 MyBatis缓存 |
freemarker velocity Thymeleaf Ehcache Guava Caffeine Redis Memcached MyBatis一级二级缓存 |
数据库 | Oracle MySQL | 缓冲区 Buffer Pool | 数据库缓存机制 |
什么是SpringCache?