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原理

  1. 纯内存操作:数据存于 RAM,避免磁盘 I/O 瓶颈

  2. 单线程模型(6.0 前)

    • 避免多线程上下文切换和锁竞争
    • 采用 I/O 多路复用(epoll/kqueue),单线程高效处理并发连接
  3. 高效数据结构:底层使用 SDS(简单动态字符串)、跳跃表、压缩列表等优化结构

  4. 非阻塞网络模型:事件驱动,响应迅速

💡 注意: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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐