Redis 核心原理与高可用架构实践

一、Redis 概述

1. 特点

  • 高性能:10万~100万+ QPS,微秒级响应
  • 丰富数据结构:String、Hash、List、Set、Sorted Set
  • 原子操作:单命令原子性,支持事务(MULTI/EXEC)
  • 持久化:RDB 快照 + AOF 日志
  • 主从复制、哨兵、集群(Cluster)高可用方案

2. 优势

  • 基于内存,C语言实现
  • 单线程模型(6.0前)+ IO多路复用(epoll)
  • 支持多种编程语言客户端
  • 功能丰富:Lua脚本、发布订阅、Pipeline、Key过期等

二、数据类型及常用命令

1. String

  • SET key value [EX seconds] [NX|XX]
  • GET key
  • INCR / DECR(原子计数器)
  • MSET / MGET(批量操作)
  • SETNX(分布式锁基础)

2. List

  • LPUSH / RPUSH(左/右插入)
  • LPOP / RPOP(左/右弹出)
  • LRANGE key start stop(范围查询)
  • BLPOP / BRPOP(阻塞式弹出)

3. Set

  • SADD key member(添加)
  • SMEMBERS key(查看全部)
  • SINTER / SUNION / SDIFF(交集/并集/差集)

4. Sorted Set(ZSet)

  • ZADD key score member(添加带分值元素)
  • ZRANGE / ZREVRANGE(按分数升/降序获取)
  • ZRANK(排名)、ZSCORE(获取分数)

5. Hash

  • HSET key field value / HGET key field
  • HMSET / HMGET(批量)
  • HGETALL(获取所有字段及值)
  • HDEL(删除字段)

三、高级特性

1. 管道(Pipeline)

  • 将多个命令打包一次发送,减少 RTT
  • 适用场景:批量操作,网络延迟高时效果显著

2. 发布/订阅(Pub/Sub)

  • SUBSCRIBE channel / PUBLISH channel message
  • PSUBSCRIBE pattern(模式订阅)
  • 消息即发即弃,无持久化

3. 事务

  • MULTI 开启,EXEC 执行,DISCARD 取消
  • 不支持回滚,但保证命令顺序执行

4. Lua 脚本

  • 原子性执行多个操作
  • EVAL script numkeys key [key ...] arg [arg ...]

四、持久化

1. RDB(快照)

  • 触发方式:save(阻塞)、bgsave(fork子进程)
  • 配置:save 900 1
  • 优点:恢复快,文件紧凑
  • 缺点:可能丢失最后一次快照后的数据

2. AOF(追加日志)

  • 记录每个写命令,重启时重放
  • 策略:always / everysec / no
  • 重写:bgrewriteaof 或自动触发(auto-aof-rewrite-percentage
  • 优点:数据更安全,最多丢1秒数据
  • 缺点:文件大,恢复慢

3. 混合持久化(RDB+AOF)

  • AOF 文件以 RDB 格式开头 + 增量命令
  • 快速恢复 + 数据安全

五、主从复制

1. 概念

  • 一个 Master 多个 Slave,数据单向同步
  • Master 可读写,Slave 只读

2. 配置

  • replicaof <master_ip> <master_port>
  • info replication 查看状态

3. 同步流程

  • Slave 发送 SYNC/PSYNC
  • Master 生成 RDB 并发送,后续增量命令持续同步

六、哨兵模式(Sentinel)

1. 作用

  • 监控主从健康,自动故障转移
  • 提供主节点地址给客户端

2. 核心配置

conf 复制代码
sentinel monitor mymaster 192.168.108.10 6379 2
sentinel down-after-milliseconds mymaster 30000

3. 故障转移流程

  1. 主观下线(SDOWN)
  2. 客观下线(ODOWN,多数哨兵确认)
  3. 选举 Leader
  4. 提升最优 Slave 为新 Master
  5. 更新其他 Slave 复制目标

七、Redis Cluster(集群)

1. 特点

  • 无中心架构,数据分片(16384 个哈希槽)
  • 每个 Master 负责一部分槽,可配 Slave
  • 自动故障转移(无需 Sentinel)

2. 数据映射

HASH_SLOT = CRC16(key) mod 16384

3. 搭建要点

  • 至少 3 主 3 从
  • 配置 cluster-enabled yes
  • 创建集群:redis-cli --cluster create <ip:port> ... --cluster-replicas 1

4. 故障转移

  • 主节点宕机,其 Slave 自动选举为新 Master
  • 集群状态变为 ok 需大部分槽可用

八、缓存典型问题

问题 定义 解决方案
雪崩 大量 Key 同时过期或 Redis 宕机 过期时间加随机值;高可用集群;限流熔断;多级缓存
穿透 查询不存在的数据(缓存+DB 都无) 缓存空值(短 TTL);布隆过滤器
击穿 热点 Key 过期,大量并发打到 DB 互斥锁;永不过期(后台异步更新)

九、常用管理命令

命令 说明
INFO [section] 查看服务器信息
CONFIG GET/SET parameter 动态修改配置(部分参数)
SLOWLOG GET/LEN/RESET 慢查询日志
KEYS pattern 查找 Key(生产慎用,阻塞)
DBSIZE 当前库 Key 数量
FLUSHDB / FLUSHALL 清空当前/所有库(建议禁用)
EXPIRE / TTL 设置/查看过期时间
SELECT dbindex 切换数据库(Cluster 不支持)

十、性能与安全建议

  • 避免使用 KEYS *,改用 SCAN 游标迭代
  • 设置 rename-command FLUSHALL "" 等禁用危险命令
  • 使用 requirepass 设置密码
  • 生产环境开启 protected-mode yes 并绑定内网 IP
  • 合理设置 maxmemory 及淘汰策略(如 allkeys-lru
  • 大 Key 拆分,避免慢操作
相关推荐
这个DBA有点耶1 小时前
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
数据库·mysql·架构
努力努力再努力wz2 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
JdSnE27zv2 小时前
Qt 操作SQLite数据库
数据库·qt·sqlite
tedcloud1232 小时前
HyperFrames部署教程:用HTML生成MP4视频
前端·数据库·人工智能·html·音视频
布朗克1682 小时前
25 IO流高级操作——序列化、NIO与Files工具类
java·数据库·io·nio
阿演2 小时前
DataDjinn 新版本更新:新增 Oracle 支持,查询窗口、表预览和连接树继续打磨
数据库·oracle·ai编程·数据库连接工具
lixora2 小时前
Oracle 11g Active Data Guard Go 自动化部署工具 v1.0
数据库·oracle
Nturmoils2 小时前
自增主键别只会 auto_increment,先把值从哪来讲清楚
数据库·后端
叶小鸡3 小时前
Java 篇-项目实战-AI 天机学堂(从 0 到 1)-day5
数据库·redis·缓存