前言

  • 分布式系统中的缓存缓存我们大多想到 Redis、MemCache。但是因为调用缓存的进程和负责缓存的进程一般部署在不同的服务器上, 所以在存储过程中往往需要通过网络交互的方式进行通信。
  • 当优化步骤考虑到网络开销, 且数据量允许的情况下, 就可以考虑使用本地缓存进行优化.

优缺点

Redis、MemCache:

  • 缓存和应用解耦

  • 支持大容量存储

  • 有成熟的API支持

  • 受到网络传输条件的限制

本地缓存:

  • 存储在本地, 访问请求快

  • 受JVM限制, 不能存储过大的数据

常见本地缓存简介

HashMap自建、Guava Cache、Caffeine、Encache

  • HashMap

基于LinkedHashMap, 用ReetrantReadWriteLock保证单进程内读写安全, 再覆写removeEldesEntry方法来决定什么时候进行过期删除即可.

  • Guava Cache

Google的开源库, 支持SpringBoot的maven引入, 可进行最大容量限制、支持根据插入时间 / 访问时间进行过期删除、自带线程安全

  • Caffeine

Guava Cache的改进版, 在过期淘汰策略上进行了改进:W-TinyLFU

  • Encache

Hibernate的默认CacheProvider, 功能更强。支持LRU、LFU、FIFO三种淘汰策略; 支持堆内存储、堆外存储、磁盘存储三种持久化方案; 支持集群。

总结

  • 性能上, Caffeine 远优于其他三种

  • 接入难度上, 三者都是maven引入, 其中Guava cache和Caffeine相互转换成本较低

  • 拓展上, Encache更优且支持持久化

常用的方案就是Caffeine本地存储+Redis/Memcache分布式存储, 如果需要持久化可以自行用流的方案实现。需要注意的是, 本地缓存贮存在JVM中, 要注意数据的过期淘汰处理, 否则会引起服务的频繁GC, 影响服务的稳定性。