【缓存技术】Redis核心原理解析

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
相关推荐
自燃人~2 分钟前
怎么优化慢SQL
数据库·sql
爱学java的ptt16 分钟前
mysql的存储引擎
数据库·mysql
小宇的天下24 分钟前
innovus Flip chip 产品设计方法(3)
数据库·windows·microsoft
GalenZhang8881 小时前
使用 Python SDK 将数据写入飞书多维表格
数据库·python·飞书·多维表格
云和数据.ChenGuang1 小时前
GaussDB 期末考试题与面试题
数据库·opengauss·gaussdb·数据库期末试题
不屈的铝合金1 小时前
SQL 语言概述与数据库核心前置配置了解
数据库·sql·mysql·约束·sql 语句分类·字符集配置·校对规则
萧曵 丶1 小时前
可重复读(Repeatable Read)隔离级别下幻读产生的原因
数据库·sql·mysql
xiaolyuh1231 小时前
ThreadLocalMap 中弱引用被 GC 后的行为机制解析
java·jvm·redis
Antoine-zxt1 小时前
MySQL宕机日志迷局破解指南:从前台启动到精准排错
数据库·mysql·adb
松涛和鸣1 小时前
DAY47 FrameBuffer
c语言·数据库·单片机·sqlite·html