服务端缓存的种类
- 数据库缓存;
- 平台级缓存;
- 应用级缓存;
数据库缓存
- 数据库缓存是一种比较特殊的缓存,是数据库自身的缓存机制;
- 比如 MySQL 的查询缓存 QueryCache,不过这种东西好像效果不是很好,只有在更新不频繁的时候才有效果,如果数据更新,那么缓存的数据也要重新加载,更新频率高的的,反而会影响性能 ,最新版的 MySQL 已经把这个功能给砍掉了;
平台级缓存
- 平台级缓存就是带有缓存功能的专用库,或者具有缓存特性的框架;
- 平台级缓存有很多种:
- Ehcache
- JBoss Cache
- OSCache
- Guava Cache
Guava Cache
- 是一个完善的本地缓存;
- 多个请求并发访问一个 key,Guava Cache 的 CacheLoader#load 方法可以控制,对同一个 key,只让一个请求去读取数据,其他的阻塞等待就可以了;
为什么不用 Map 做本地缓存
- 内存管理:Map 本身就是一个 Java 对象,在往这个对象中放数据的时候,其并没有对使用的内存做控制和管理,不断的往里面放数据,会使这个对象占用的内存越来越大,需要自己写代码控制内存的释放;
- 缓存过期策略:Map 没有这个功能;
- 容量规划:缓存总地有个容量大小的限制,Map 没有这种限制;
- 线程安全:Map 不是线程安全的;
- 持久化:Map 的数据是存储在内存中,重启的时候数据就丢失了;
- 多实例数据同步及一致性:Map 无法做到多实例之间的数据同步;
平台级缓存的特点
- 基于应用程序的缓存库;
- 具有一定的分布式能力;
- 数据不能保证强一致性;
- 无法保证高可用;
应用级缓存
- 当平台级缓存不能满足系统的性能要求的时候,需要开发者通过代码来实现缓存控制,这就需要集中式缓存:
- 集中式缓存的代表:Redis,Memcache;
- CDN 缓存;
Redis vs Memcache
比较项 | Memcache | Redis |
---|---|---|
数据结构 | 只支持简单的 key-value 结构 | String / Hash / List / Set / SortedList |
持久化 | 不支持 | 支持 |
容量大小 | 内存,数据存储不宜过多 | 内存 |
读写性能 | 很高 | 很高 |
线程模型 | 多线程 | Redis 6.0 以前是单线程 |
CDN 缓存的优点
- 本地 Cache 加速;
- 实现跨运营商的网络加速;
- 远程加速;
- 带宽优化;
- 集群抗攻击(抗 DDos 攻击);