【缓存技术】Redis核心原理解析
方案说明适用场景主从复制(Replication)1 主 N 从,数据异步同步读写分离、数据备份哨兵模式(Sentinel)监控主从状态,自动故障转移中小规模,要求自动 failover集群模式(Cluster)数据分片(16384 slots),去中心化大规模、高并发、海量数据。
·
Redis 核心原理
1. 关系型数据库 vs 非关系型数据库
| 特性 | 关系型数据库(RDBMS) | 非关系型数据库(NoSQL) |
|---|---|---|
| 数据模型 | 表结构(行/列),严格 Schema | 灵活模型:键值对、文档、列族、图等 |
| 典型代表 | MySQL, PostgreSQL, Oracle | Redis(键值), MongoDB(文档), Cassandra(列族) |
| 事务支持 | ACID 强一致性 | 多数最终一致性,部分支持弱事务 |
| 扩展方式 | 垂直扩展(Scale Up)为主 | 水平扩展(Scale Out)为主 |
| 查询语言 | SQL(标准化) | 各自专用 API 或类 SQL |
| 适用场景 | 金融、ERP 等强一致性业务 | 缓存、实时推荐、高并发读写场景 |
核心区别:
- RDBMS 强调 数据一致性与完整性;
- NoSQL 强调 高性能、高可用与可扩展性。
2. Redis 概念与优势
Redis(Remote Dictionary Server)是一个开源的、基于内存的 键值存储系统,支持多种数据结构(String、Hash、List、Set、Sorted Set 等),常用于缓存、消息队列、会话存储等场景。
2.1 Redis 的核心优点
- 极高的读写性能:单机可达 10w+ QPS
- 丰富的数据类型:超越简单 key-value,支持复杂结构
- 持久化支持:RDB 快照 + AOF 日志,保障数据不丢失
- 高可用架构:主从复制、哨兵(Sentinel)、集群(Cluster)
- 原子性操作:所有命令天然原子,支持 Lua 脚本事务
- 内存管理高效:支持 LRU/LFU 等淘汰策略
2.2 Redis原理
-
纯内存操作:数据存于 RAM,避免磁盘 I/O 瓶颈
-
单线程模型(6.0 前)
:
- 避免多线程上下文切换和锁竞争
- 采用 I/O 多路复用(epoll/kqueue),单线程高效处理并发连接
-
高效数据结构:底层使用 SDS(简单动态字符串)、跳跃表、压缩列表等优化结构
-
非阻塞网络模型:事件驱动,响应迅速
💡 注意:Redis 6.0 引入多线程 I/O(仅用于网络读写),但命令执行仍为单线程,保证原子性。
3. Redis 安装与部署
Linux 下快速安装(以 CentOS 为例)
# 1. 安装依赖
yum install gcc tcl -y
# 2. 下载源码(以 7.2 为例)
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4
# 3. 编译安装
make && make install
# 4. 启动服务(默认前台运行)
redis-server
# 5. 后台运行(修改配置文件)
cp redis.conf /etc/redis.conf
sed -i 's/supervised no/supervised systemd/g' /etc/redis.conf
sed -i 's/daemonize no/daemonize yes/g' /etc/redis.conf
redis-server /etc/redis.conf
配置关键参数(redis.conf)
bind 0.0.0.0 # 允许远程访问(生产环境建议限制 IP)
port 6379 # 默认端口
requirepass your_strong_password # 设置密码(必须!)
maxmemory 2gb # 限制最大内存
maxmemory-policy allkeys-lru # 内存淘汰策略
4. Redis 常用操作指令
4.1 通用命令
KEYS * # 查看所有 key(慎用!)
EXISTS key # 判断 key 是否存在
DEL key # 删除 key
TTL key # 查看剩余生存时间
TYPE key # 查看 key 类型
4.2 String(字符串)
1SET name "Alice" # 设置
2GET name # 获取
3INCR counter # 自增(原子操作)
4SETEX token 3600 "abc" # 设置并指定过期时间(秒)
4.3 Hash(哈希)
1HSET user:1001 name "Bob" age 30
2HGET user:1001 name
3HGETALL user:1001 # 获取所有字段
4.4 List(列表)
LPUSH logs "error1" # 左插入(队列头)
RPUSH logs "info1" # 右插入(队列尾)
LPOP logs # 左弹出(先进先出)
BRPOP logs 5 # 阻塞式弹出(实现消息队列)
4.5 Set(集合)
SADD tags "redis" "db" "cache"
SMEMBERS tags # 查看所有成员
SISMEMBER tags "redis" # 判断是否在集合中
4.6 Sorted Set(有序集合)
ZADD leaderboard 100 "player1" 95 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES # 按分数升序
ZREVRANK leaderboard "player1" # 查询排名
5. Redis 高可用概述(概念性)
Redis 高可用主要通过以下三种机制实现:
| 方案 | 说明 | 适用场景 |
|---|---|---|
| 主从复制(Replication) | 1 主 N 从,数据异步同步 | 读写分离、数据备份 |
| 哨兵模式(Sentinel) | 监控主从状态,自动故障转移 | 中小规模,要求自动 failover |
| 集群模式(Cluster) | 数据分片(16384 slots),去中心化 | 大规模、高并发、海量数据 |
6. 持久化机制
Redis 提供两种持久化方式,可单独或组合使用。
(1)RDB(Redis Database)—— 快照模式
-
原理:在指定时间间隔内,将内存数据全量写入磁盘(二进制 dump.rdb 文件)
-
触发方式
:
SAVE:阻塞主线程(不推荐)BGSAVE:fork 子进程异步保存(推荐)- 配置自动触发(如
save 900 1表示 900 秒内至少 1 次修改则保存)
优点:
- 文件紧凑,恢复速度快
- 适合备份、灾难恢复
缺点:
- 可能丢失最后一次快照后的数据
- fork 大内存实例时可能阻塞
(2)AOF(Append Only File)—— 日志模式
-
原理:记录每个写命令到日志文件(append-only.aof),重启时重放命令恢复数据
-
同步策略
(
appendfsync):
always:每次写都刷盘(最安全,性能差)everysec:每秒刷盘(推荐,平衡安全与性能)no:由 OS 决定(最快,可能丢数据)
优点:
- 数据丢失少(最多 1 秒)
- 日志可读,便于审计
缺点:
- 文件体积大
- 恢复速度慢
(3)混合持久化(Redis 4.0+)
- 开启
aof-use-rdb-preamble yes - AOF 文件前半部分是 RDB 格式快照,后半部分是 AOF 命令
- 兼顾恢复速度与数据安全性
生产建议:
- 同时开启 RDB + AOF(everysec)
- 定期备份
.rdb和.aof文件
7. 性能管理与优化
(1)内存优化
-
设置最大内存:
maxmemory 4gb -
选择合适淘汰策略
maxmemory-policy allkeys-lru # 所有 key 按 LRU 淘汰(通用) maxmemory-policy volatile-lru # 仅对设置了过期时间的 key 淘汰 -
避免 bigkey:单个 value 不宜过大(如 > 1MB),使用
redis-cli --bigkeys检测
(2)CPU 与阻塞命令
-
禁用危险命令
rename-command KEYS "" rename-command FLUSHALL "" -
避免 O(N) 命令:如
KEYS *,SMEMBERS,LRANGE(大数据量)
(3)网络与连接
- 使用连接池(如 JedisPool),避免频繁创建连接
- 启用
tcp-keepalive防止空闲连接被中间设备断开
(4)监控与诊断
# 实时监控
redis-cli --stat
# 查看慢查询(默认记录 > 10ms 的命令)
SLOWLOG GET 10
# 查看内存使用详情
INFO memory
# 查看客户端连接
CLIENT LIST
(5)配置优化建议
# 关闭透明大页(THP),避免 fork 延迟
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 调整 TCP backlog
net.core.somaxconn = 65535
vm.overcommit_memory = 1
更多推荐


所有评论(0)