缓存拓扑
客户端分布式
缓存分布在应用服务器上,每个应用实例维护自己的本地缓存。
中心式分布式
独立的缓存服务器集群,所有应用共享访问。
混合式分布式
结合本地缓存和远程缓存,多级缓存架构。
动态演示分布式缓存的工作机制与应用场景
分布式缓存是一种将数据缓存分散存储在多个节点上的系统架构,通过数据分片和复制来提供高性能、高可用性和可扩展性的缓存服务。
缓存分布在应用服务器上,每个应用实例维护自己的本地缓存。
独立的缓存服务器集群,所有应用共享访问。
结合本地缓存和远程缓存,多级缓存架构。
分布式缓存系统需要在性能和一致性之间做出权衡,常见的一致性策略包括:
使用哈希算法将数据映射到不同节点。
减少节点变化时的数据迁移量。
提高数据分布的均匀性。
Redis集群通过分片机制实现数据分布式存储,支持主从复制和故障转移。
// Redis集群配置示例
@Configuration
public class RedisClusterConfig {
@Bean
public RedisClusterConfiguration redisClusterConfiguration() {
RedisClusterConfiguration cluster = new RedisClusterConfiguration();
cluster.setMaxRedirects(3);
cluster.setClusterNodes(Arrays.asList(
new RedisNode("redis1", 6379),
new RedisNode("redis2", 6379),
new RedisNode("redis3", 6379)
));
return cluster;
}
}
Memcached采用客户端分片方式实现分布式缓存,简单高效。
// Memcached配置示例
MemcachedClient client = new MemcachedClient(
new ConnectionFactoryBuilder()
.setDaemon(true)
.setFailureMode(FailureMode.Retry)
.build(),
AddrUtil.getAddresses("server1:11211 server2:11211")
);
EhCache支持分布式缓存和多级缓存,适合Java应用。
应用程序同时维护缓存和数据库,是最常用的缓存模式。
缓存负责从数据源加载数据,对应用透明。
写操作先更新缓存,再由缓存同步更新数据库。
写操作只更新缓存,异步批量更新数据库。
缓存与数据库的数据一致性问题,包括更新策略和失效策略。
大量缓存同时失效,导致请求直接访问数据库,引起系统雪崩。
查询不存在的数据,导致请求直接访问数据库。
某些缓存数据被频繁访问,导致缓存节点负载不均衡。
特性 | Redis集群 | Memcached | EhCache |
---|---|---|---|
数据结构 | 丰富的数据类型 | 简单key-value | 对象存储 |
持久化 | 支持 | 不支持 | 支持 |
分布式策略 | 服务端分片 | 客户端分片 | RMI/JGroups |
一致性 | 强一致性 | 最终一致性 | 可配置 |
性能 | 高 | 极高 | 中等 |
扩展性 | 良好 | 良好 | 一般 |