【架构实战】缓存架构 Redis 集群部署

一、Redis缓存的重要性

在高并发系统中,缓存是必不可少的。Redis作为最流行的内存数据库,以其高性能、低延迟的特点,成为缓存层的首选。

二、单机Redis的瓶颈

单机Redis虽然性能优异,但存在以下问题:

  • 容量限制:受单机内存限制
  • 可用性风险:单点故障导致整个缓存层瘫痪
  • 性能瓶颈:无法水平扩展

三、Redis集群架构

1. Redis主从复制

复制代码
Master (读写)
  ↓ 复制
Slave1 (只读)
Slave2 (只读)
yaml 复制代码
# Master配置
port 6379
bind 0.0.0.0

# Slave配置
port 6380
slaveof 127.0.0.1 6379

2. Redis Sentinel(哨兵模式)

复制代码
Sentinel1 ─┐
Sentinel2 ─┼─ 监控 Master/Slave
Sentinel3 ─┘
yaml 复制代码
# sentinel.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

3. Redis Cluster(集群模式)

复制代码
┌─────────┐
│ Node 1  │ (Slot 0-5460)
└─────────┘
     ↓
┌─────────┐
│ Node 2  │ (Slot 5461-10922)
└─────────┘
     ↓
┌─────────┐
│ Node 3  │ (Slot 10923-16383)
└─────────┘

四、Redis Cluster部署

1. 启动集群节点

bash 复制代码
# 启动6个节点(3主3从)
redis-server --port 7000 --cluster-enabled yes --cluster-config-file nodes-7000.conf
redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes-7001.conf
redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes-7002.conf
redis-server --port 7003 --cluster-enabled yes --cluster-config-file nodes-7003.conf
redis-server --port 7004 --cluster-enabled yes --cluster-config-file nodes-7004.conf
redis-server --port 7005 --cluster-enabled yes --cluster-config-file nodes-7005.conf

2. 创建集群

bash 复制代码
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

3. 验证集群

bash 复制代码
redis-cli -c -p 7000
> cluster info
> cluster nodes

五、Java客户端连接

java 复制代码
@Configuration
public class RedisConfig {
    
    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory();
    }
    
    @Bean
    public RedisTemplate redisTemplate(
            LettuceConnectionFactory connectionFactory) {
        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        
        // 设置序列化
        StringRedisSerializer stringSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringSerializer);
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        return template;
    }
}

@Service
public class CacheService {
    
    @Autowired
    private RedisTemplate redisTemplate;
    
    public void set(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }
    
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

六、集群常见问题

问题1:数据倾斜

原因 :某个节点的Slot数据量过大
解决:使用 redis-cli --cluster rebalance 重新平衡

问题2:集群分裂

原因 :网络分区导致集群分裂
解决:配置 cluster-node-timeout 和 cluster-replica-validity-factor

问题3:性能下降

原因 :网络延迟、GC暂停
解决:优化网络、调整JVM参数

七、总结

Redis集群提供了高可用和水平扩展的能力,但也增加了复杂性。选择合适的架构(主从/Sentinel/Cluster)需要根据业务规模和可用性要求来决定。

思考题:在你的项目中,为什么选择了当前的Redis架构?有没有遇到过集群相关的问题?


个人观点,仅供参考

相关推荐
你听得到115 分钟前
Get 这波之后,我把 Flutter 状态管理重新看了一遍:新项目到底该选谁?
前端·flutter·架构
ruan1145147 分钟前
Redis--个人学习记录
数据库·redis·学习
程序员潘子1 小时前
【保姆级教程】B 站缓存 m4s 文件转 MP4,无损合成一行命令搞定
缓存·ffmpeg·ffmpeg\
Micro麦可乐1 小时前
Redis只会用来做缓存?解锁Redis非缓存的九个应用场景,90%程序员不知道的隐藏技能
数据库·redis·缓存·消息队列·分布式锁·延迟队列·布隆过滤器
键盘鼓手苏苏1 小时前
Flutter 三方库 persistent_cache_simple 的鸿蒙化适配指南 - 实现具备磁盘溢出淘汰与极简 API 的本地持久化缓存、支持端侧资源异步落地与状态秒开实战
flutter·缓存·harmonyos
21号 11 小时前
10.Redis 缓存
数据库·redis·缓存
从零开始的-CodeNinja之路1 小时前
【Redis】Redis 缓存应用、淘汰机制—(四)
java·redis·缓存
星辰徐哥1 小时前
CDN工作原理:节点缓存、智能调度,减少跨网传输延迟
服务器·缓存·php
星辰徐哥1 小时前
ARP缓存表:作用、查看方法与刷新技巧
开发语言·缓存·php
AIData搭子1 小时前
Vector 基于多索引表架构的大规模向量检索
架构