Redis笔记
-
Redis 简介
-
持久化机制
-
RDB 快照
-
AOF 追加文件
-
混合持久化
-
-
主从复制
-
Docker Compose 配置
-
测试主从同步
-
-
哨兵模式(Sentinel)
-
架构与原理
-
配置与部署
-
故障转移测试
-
-
Redis Cluster 集群
-
概念与哈希槽
-
3 主 3 从搭建
-
数据分片验证
-
自动故障转移测试
-
-
清理环境
-
附录:常见问题与警告
1. Redis 简介
Redis 是一个开源的内存数据结构存储系统,用作数据库、缓存和消息代理。支持字符串、哈希、列表、集合、有序集合等数据类型。其高性能和丰富的功能使其成为后端开发的核心组件。
2. 持久化机制
Redis 提供多种持久化方式,确保数据在重启后不丢失。
2.1 RDB(快照)
-
原理:在指定时间间隔内,将内存数据集写入磁盘(二进制文件
dump.rdb)。 -
触发:自动(
save配置)或手动(BGSAVE)。 -
优点:文件紧凑,恢复速度快,性能影响小。
-
缺点:可能丢失最后一次快照之后的数据。
配置示例(redis.conf):
conf
save 900 1 # 900秒内至少1个key变化则保存 save 300 10 save 60 10000 dbfilename dump.rdb dir /data
2.2 AOF(追加文件)
-
原理:记录每个写操作命令,追加到
appendonly.aof文件。 -
同步策略:
-
always:每个命令同步磁盘(最安全,性能低) -
everysec:每秒同步一次(默认,最多丢1秒数据) -
no:由操作系统决定
-
-
优点:数据安全性高,可读性好,支持修复。
-
缺点:文件体积大,恢复速度慢。
配置示例:
conf
appendonly yes appendfilename "appendonly.aof" appendfsync everysec auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
2.3 混合持久化(Redis 4.0+)
-
原理:AOF 重写时,将当前数据以 RDB 格式写入 AOF 文件开头,后续新命令以 AOF 格式追加。
-
优点:兼顾快速恢复(RDB)和数据安全(AOF)。
-
启用:
conf
aof-use-rdb-preamble yes
3. 主从复制
3.1 架构
-
一个主节点(可写),多个从节点(只读)。
-
从节点通过
slaveof命令复制主节点数据,实现读写分离和热备份。
3.2 Docker Compose 部署
创建目录 ~/redis-replication,编写 docker-compose.yml:
yaml
version: '3.8' services: redis-master: image: redis:7.2 container_name: redis-master ports: - "6379:6379" command: redis-server --appendonly yes networks: - redis-net redis-slave1: image: redis:7.2 container_name: redis-slave1 ports: - "6380:6379" command: redis-server --slaveof redis-master 6379 --appendonly yes depends_on: - redis-master networks: - redis-net redis-slave2: image: redis:7.2 container_name: redis-slave2 ports: - "6381:6379" command: redis-server --slaveof redis-master 6379 --appendonly yes depends_on: - redis-master networks: - redis-net networks: redis-net: driver: bridge
3.3 测试主从同步
bash
# 启动服务 cd ~/redis-replication docker compose up -d # 主节点写入数据 docker exec -it redis-master redis-cli 127.0.0.1:6379> set name "redis master" OK # 从节点读取数据 docker exec -it redis-slave1 redis-cli get name "redis master" # 查看从节点角色 docker exec -it redis-slave1 redis-cli info replication # role:slave, master_host:redis-master
结论:从节点成功复制主节点数据,且为只读。
4. 哨兵模式(Sentinel)
4.1 原理
哨兵是一个独立进程,用于监控主从集群,实现自动故障转移。多个哨兵组成分布式系统,通过投票决定主节点是否客观下线并选举新主。
4.2 部署架构
-
1 个主节点 + 2 个从节点 + 3 个哨兵(奇数个)
-
所有服务在同一 Docker 网络中,使用容器名通信。
4.3 配置文件
sentinel1.conf(其余两个相同,端口一致):
conf
port 26379 sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 bind 0.0.0.0
4.4 Docker Compose 完整配置
在 docker-compose.yml 中添加哨兵服务(接上面主从配置):
yaml
sentinel1: image: redis:7.2 container_name: sentinel1 ports: - "26379:26379" command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf depends_on: - redis-master - redis-slave1 - redis-slave2 networks: - redis-net sentinel2: # 类似,映射 26380:26379 sentinel3: # 类似,映射 26381:26379
4.5 测试故障转移
bash
# 启动所有服务 docker compose up -d # 查看哨兵状态 docker exec -it sentinel1 redis-cli -p 26379 sentinel masters # 停止主节点 docker stop redis-master # 观察哨兵日志(约15秒后切换) docker logs sentinel1 -f # 查看新主节点(应该是某个从节点升级) docker exec -it redis-slave1 redis-cli info replication | grep role # role:master # 恢复原主节点(自动成为从节点) docker start redis-master
结论:哨兵成功检测主节点宕机,并完成自动故障转移,原主恢复后降级为从节点。
5. Redis Cluster 集群
5.1 核心概念
-
哈希槽:16384 个槽,每个 key 通过
CRC16(key) % 16384映射到某个槽。 -
分片:每个主节点负责一部分槽,多个主节点共同承载所有数据。
-
高可用:每个主节点可有多个从节点,主节点故障时从节点自动提升。
-
去中心化:节点间通过 gossip 协议通信,无需哨兵。
5.2 部署 3 主 3 从集群(使用 Docker 内部网络)
创建目录 ~/redis-cluster-test,编写 docker-compose.yml:
yaml
version: '3.8'
services:
redis1: { image: redis:7.2, container_name: redis-cluster-1, networks: [redis-cluster-net], command: redis-server --port 6379 --cluster-enabled yes --appendonly yes }
redis2: { ... }
redis3: { ... }
redis4: { ... }
redis5: { ... }
redis6: { ... }
networks:
redis-cluster-net:
driver: bridge
详细配置请见后文完整命令。
5.3 创建集群
bash
# 启动容器 cd ~/redis-cluster-test docker compose up -d # 创建集群(使用临时容器,同一网络) docker run --rm -it --network redis-cluster-net redis:7.2 \ redis-cli --cluster create \ redis1:6379 redis2:6379 redis3:6379 \ redis4:6379 redis5:6379 redis6:6379 \ --cluster-replicas 1 # 输入 yes 确认
5.4 验证集群状态
bash
# 进入任意容器 docker exec -it redis-cluster-1 redis-cli -c 127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_known_nodes:6 127.0.0.1:6379> cluster nodes # 输出显示3个master和3个slave
5.5 数据分片测试
bash
127.0.0.1:6379> set user:1000 "Alice" -> Redirected to slot [5798] located at 172.28.0.7:6379 OK 172.28.0.7:6379> get user:1000 "Alice" # 写入多个key,观察自动重定向 set user:2000 "Bob" set order:5000 "Order5000"
5.6 故障转移测试
bash
# 宿主机停止一个主节点(例如 redis-cluster-2) docker stop redis-cluster-2 # 等待30秒,查看集群节点状态 docker exec -it redis-cluster-1 redis-cli -c cluster nodes # 原主节点标记为 fail,其从节点升级为 master # 恢复原主节点 docker start redis-cluster-2 # 稍后它会以 slave 身份重新加入
结果:集群自动完成故障转移,业务不中断。
6. 清理环境
bash
# 主从+哨兵 cd ~/redis-replication docker compose down -v # 集群 cd ~/redis-cluster-test docker compose down -v docker network rm redis-cluster-net
7. 附录:常见问题与警告
7.1 哨兵警告 Could not rename tmp config file
-
原因:Docker bind mount 不支持
rename操作。 -
影响:不影响功能,可忽略或改用 Docker 卷。
7.2 内存 overcommit 警告
-
解决:宿主机执行
sysctl vm.overcommit_memory=1并永久配置。
7.3 集群创建卡在 Waiting for the cluster to join
-
原因:节点无法通过
127.0.0.1或未开放总线端口(16379等)。 -
解决:使用 Docker 内部网络(容器名通信)或配置
--cluster-announce-ip为宿主机真实 IP,并开放防火墙/安全组。
7.4 客户端连接集群失败
-
使用支持集群协议的客户端(如
redis-cli -c、JedisCluster、lettuce)。 -
若使用端口映射,需同时映射业务端口(6379)和总线端口(16379)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)