1. 分布式缓存

分布式缓存是指多个服务器共同使用的缓存,缓存数据存储在独立的缓存服务器上,而不是存放在应用服务器的本地内存中。这种缓存可以被多个服务器共享,提高数据访问速度,减少数据库负载。

特点:

  • 适用于分布式系统,多个应用实例可以共享缓存数据。

  • 数据持久性(部分支持持久化)。

  • 更强的扩展性,可以水平扩展,提高缓存容量。

  • 一致性问题,需要额外的机制保证数据一致性。

  • 适用于高并发和大规模数据的场景

常见技术:

  1. Redis

    • 内存数据库,支持键值存储,提供丰富的数据结构(String、List、Set、Hash、ZSet等)。

    • 支持持久化(RDB、AOF)。

    • 支持集群(Redis Cluster)和高可用(Sentinel)。

    • 具备数据过期、LRU 淘汰策略等。

  2. Memcached

    • 轻量级键值存储,适用于高速缓存场景。

    • 仅支持简单的 key-value 结构,不支持复杂数据类型。

    • 不支持持久化,数据存储在内存中,服务器重启后数据会丢失。

    • 适合读多写少的场景。

  3. Etcd/ZooKeeper

    • 主要用于分布式协调和配置管理,也可以用于缓存部分元数据。


2. 本地缓存

本地缓存是指数据缓存存储在应用程序的本地内存中,而不是独立的缓存服务器中。这种方式可以加快数据访问速度,但无法被多个服务器共享。

特点:

  • 访问速度极快,数据存储在本地内存,不需要网络开销。

  • 适用于单机应用或少量数据的缓存

  • 数据一致性问题,不同实例间的缓存数据可能不同步。

  • 受限于本机内存大小,无法存储大量数据。

  • 适用于短期缓存和热点数据的存储

常见技术:

  1. Caffeine

    • Java 本地缓存库,支持基于访问时间、写入时间、使用频率等的淘汰策略。

    • 性能优越,替代 Guava Cache。

    • 适用于 Java 应用中的短期缓存需求,如查询结果缓存计算结果缓存等。

  2. Guava Cache

    • 由 Google 提供的 Java 本地缓存库。

    • 支持 TTL(时间过期)、LRU(最近最少使用)等策略。

    • 相比 Caffeine,性能稍逊色,近年来逐渐被 Caffeine 替代。

  3. Ehcache

    • 适用于 Java 应用的本地缓存框架。

    • 支持磁盘存储(即数据可落盘,防止进程重启丢失)。

    • 可作为 Hibernate 的二级缓存。


3. 分布式缓存 vs 本地缓存

对比项

分布式缓存(Redis/Memcached)

本地缓存(Caffeine/Guava)

访问速度

较快(网络传输开销)

最快(本地内存访问)

适用场景

分布式、多实例应用

单机、小规模应用

数据共享

可多个服务器共享

仅限单个服务器

数据一致性

需要额外同步机制

不适合多实例共享

存储容量

受限于集群大小

受限于本机内存

复杂性

较高,需要运维

较低,开箱即用


4. 典型应用场景

  • 本地缓存(Caffeine)

    • 适用于热点数据,如数据库查询结果、计算结果等,减少频繁访问数据库的开销。

    • 适用于单机应用,如 Spring Boot 本地缓存

    • 分布式缓存(Redis)

      • 适用于多实例的应用,如分布式系统中的用户会话管理高并发访问数据等。