前言
Redis作为高性能内存数据库,凭借其丰富的数据结构和原子操作特性,在缓存领域占据核心地位。本文将深入解析Redis在不同缓存场景下的最佳实践与实现方案,结合具体代码示例和生产环境经验,帮助开发者构建高效、稳定、可扩展的缓存系统。
一、缓存基础架构与核心模式
1. 缓存部署架构
(1)单节点缓存
适用场景:测试环境、非核心业务
优缺点:
- ✅ 部署简单,成本低
- ❌ 无高可用保障,单点故障风险
(2)主从复制
配置示例:
# 从节点配置
replicaof 192.168.1.1 6379
replica-read-only yes
读写分离实现:
// 基于Sentinel的读写分离配置
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("192.168.1.1", 26379)
.sentinel("192.168.1.2", 26379)
.sentinel("192.168.1.3", 26379);
return new LettuceConnectionFactory(sentinelConfig);
}
(3)Redis Cluster
分片原理:
- 16384个哈希槽(Hash Slot)
- 每个节点负责一部分哈希槽
- 客户端通过CRC16(key) % 16384计算槽位
集群创建命令:
# 创建3主3从集群
redis-cli --cluster create 192.168.1.1:7000 192.168.1.2:7001 \
192.168.1.3:7002 192.168.1.4:7003 \
192.168.1.5:7004 192.168.1.6:7005 \
--cluster-replicas 1
2. 缓存读写模式
(1)Cache-Aside(旁路缓存)
流程图:
(2)Read/Write-Through(读写穿透)
实现关键点:
- 缓存层负责数据库读写
- 应用层只与缓存交互
- 示例框架:Hazelcast、Ehcache
(3)Write-Behind(异步写回)
优缺点:
- ✅ 高性能,写操作仅需更新缓存
- ❌ 数据一致性风险,可能丢失未持久化数据
- 💡 适用场景:日志收集、统计数据更新
二、典型缓存场景与解决方案
1. 页面缓存
(1)HTML片段缓存
动态内容处理:
// 页面片段缓存示例
public String renderProductPage(Long productId) {
StringBuilder html = new StringBuilder();
// 1. 从缓存获取头部(全站共用)
String header = redisClient.get("page:header");
html.append(header);
// 2. 生成动态内容
Product product = productService.getProduct(productId);
html.append(renderProductDetails(product));
// 3. 从缓存获取底部
String footer = redisClient.get("page:footer");
html