1. 分布式缓存
分布式缓存是指多个服务器共同使用的缓存,缓存数据存储在独立的缓存服务器上,而不是存放在应用服务器的本地内存中。这种缓存可以被多个服务器共享,提高数据访问速度,减少数据库负载。
特点:
适用于分布式系统,多个应用实例可以共享缓存数据。
数据持久性(部分支持持久化)。
更强的扩展性,可以水平扩展,提高缓存容量。
一致性问题,需要额外的机制保证数据一致性。
适用于高并发和大规模数据的场景。
常见技术:
Redis:
内存数据库,支持键值存储,提供丰富的数据结构(String、List、Set、Hash、ZSet等)。
支持持久化(RDB、AOF)。
支持集群(Redis Cluster)和高可用(Sentinel)。
具备数据过期、LRU 淘汰策略等。
Memcached:
轻量级键值存储,适用于高速缓存场景。
仅支持简单的 key-value 结构,不支持复杂数据类型。
不支持持久化,数据存储在内存中,服务器重启后数据会丢失。
适合读多写少的场景。
Etcd/ZooKeeper:
主要用于分布式协调和配置管理,也可以用于缓存部分元数据。
2. 本地缓存
本地缓存是指数据缓存存储在应用程序的本地内存中,而不是独立的缓存服务器中。这种方式可以加快数据访问速度,但无法被多个服务器共享。
特点:
访问速度极快,数据存储在本地内存,不需要网络开销。
适用于单机应用或少量数据的缓存。
数据一致性问题,不同实例间的缓存数据可能不同步。
受限于本机内存大小,无法存储大量数据。
适用于短期缓存和热点数据的存储。
常见技术:
Caffeine:
Java 本地缓存库,支持基于访问时间、写入时间、使用频率等的淘汰策略。
性能优越,替代 Guava Cache。
适用于 Java 应用中的短期缓存需求,如查询结果缓存、计算结果缓存等。
Guava Cache:
由 Google 提供的 Java 本地缓存库。
支持 TTL(时间过期)、LRU(最近最少使用)等策略。
相比 Caffeine,性能稍逊色,近年来逐渐被 Caffeine 替代。
Ehcache:
适用于 Java 应用的本地缓存框架。
支持磁盘存储(即数据可落盘,防止进程重启丢失)。
可作为 Hibernate 的二级缓存。
3. 分布式缓存 vs 本地缓存
4. 典型应用场景
本地缓存(Caffeine)
适用于热点数据,如数据库查询结果、计算结果等,减少频繁访问数据库的开销。
适用于单机应用,如 Spring Boot 本地缓存
。分布式缓存(Redis)
适用于多实例的应用,如分布式系统中的用户会话管理、高并发访问数据等。