博客_Redis入门到实战

Redis 从入门到实战:安装 / 数据类型 / 持久化 / 主从哨兵集群 全攻略

前言

Redis 是一款开源的、基于内存的、支持多种数据结构的键值对(Key-Value)存储系统,常被称为"缓存之王"或"数据结构的服务器"。它凭借极快的读写性能、丰富的数据类型、强大的持久化和高可用机制,成为后端开发与运维的必备技能。

本文系统讲解 Redis 的核心知识:简介特性 → 安装与基本使用 → 五大数据类型 → 常用命令 → 持久化(RDB/AOF)→ 主从复制 → 哨兵 → 集群,帮助你在 CSDN 一站式掌握 Redis。


第 1 章 Redis 简介与特性

1.1 什么是 Redis

Redis 全称 REmote DIctionary Server(远程字典服务器),由意大利人 Salvatore Sanfilippo(antirez)于 2009 年开发,以 C 语言编写。

它是一种基于内存 的数据库,数据默认存储在内存中,因此读写速度极快(可达每秒 10 万+ 次读、10 万+ 次写),通常作为缓存使用,也可以作为轻量级数据库或消息队列使用。

1.2 Redis 的核心特性

特性 说明
基于内存 数据在内存中,读写极快
多种数据结构 支持 String、Hash、List、Set、Sorted Set 等
单线程模型 单线程执行命令,天然避免并发竞争,操作原子
支持持久化 RDB 快照 + AOF 日志,重启可恢复数据
高可用 支持主从复制、哨兵(Sentinel)、集群(Cluster)
支持过期键 可为键设置 TTL,自动删除过期数据
发布订阅 支持 PUBLISH / SUBSCRIBE 消息通信
事务 支持 MULTI / EXEC 简单事务

1.3 Redis 与 Memcached 对比

对比项 Redis Memcached
数据结构 多种(String/Hash/List/Set 等) 仅 Key-Value 字符串
持久化 支持(RDB/AOF) 不支持
数据类型扩展 丰富 单一
集群/高可用 支持哨兵、集群 依靠客户端分片
适用场景 缓存、队列、计数器等 纯缓存场景

1.4 Redis 版本演进

版本 主要特性
Redis 3.0 引入 Redis Cluster 集群
Redis 4.0 引入模块系统、混合持久化
Redis 5.0 引入 Stream(流)数据结构
Redis 6.0 引入多线程 IO、RESP3 协议、ACL 访问控制
Redis 7.0 引入多 AOF 文件、函数、ACL 增强

第 2 章 Redis 安装与基本使用

2.1 安装 Redis(编译安装,以 CentOS 为例)

bash 复制代码
# 1. 安装依赖
yum install -y gcc gcc-c++ make wget tar

# 2. 下载源码包(以 6.2 为例)
wget https://download.redis.io/releases/redis-6.2.13.tar.gz

# 3. 解压并进入目录
tar -zxf redis-6.2.13.tar.gz
cd redis-6.2.13

# 4. 编译并安装
make
make install

# 5. 查看版本
redis-server --version
redis-cli --version

2.2 配置 Redis

bash 复制代码
# 复制配置文件到指定目录
mkdir -p /etc/redis
cp redis.conf /etc/redis/redis.conf

# 修改核心配置
vim /etc/redis/redis.conf
# 后台运行
# daemonize yes
# 绑定地址(改为允许远程访问)
# bind 0.0.0.0
# 关闭保护模式
# protected-mode no
# 设置密码
# requirepass 123456
# 端口(默认 6379)
# port 6379

2.3 启动与关闭 Redis

bash 复制代码
# 前台启动(会占用终端)
redis-server

# 后台启动(推荐,需 daemonize yes)
redis-server /etc/redis/redis.conf

# 检查进程
ps -ef | grep redis

# 关闭(连接客户端后执行 shutdown)
redis-cli shutdown
# 或指定端口/密码关闭
redis-cli -p 6379 -a 123456 shutdown

2.4 进入 Redis 客户端

bash 复制代码
# 本机连接
redis-cli

# 指定端口、密码、远程主机连接
redis-cli -h 192.168.108.10 -p 6379 -a 123456

# 测试连通性
127.0.0.1:6379> ping
# PONG

# 切换数据库(默认 16 个库,编号 0-15)
127.0.0.1:6379> select 1
127.0.0.1:6379[1]>

# 退出
127.0.0.1:6379> quit

2.5 redis-cli 常用选项

选项 说明
-h 指定主机地址
-p 指定端口(默认 6379)
-a 指定密码
-n 指定数据库编号
-r 重复执行命令次数
-i 间隔执行时间

第 3 章 Redis 五大数据类型

Redis 最核心的价值是它丰富的数据结构。下面逐一讲解 String、Hash、List、Set、Sorted Set(ZSet)。

3.1 String(字符串)

String 是最基本的类型,一个 Key 对应一个 Value,最大 512MB。可存字符串、数字、二进制数据。

bash 复制代码
# 设置 / 获取 / 删除
127.0.0.1:6379> set name laogao
127.0.0.1:6379> get name        # "laogao"
127.0.0.1:6379> del name

# 设置过期时间
127.0.0.1:6379> set token abc ex 60     # 60 秒后过期

# 数值自增 / 自减
127.0.0.1:6379> set num 10
127.0.0.1:6379> incr num        # 11
127.0.0.1:6379> decr num        # 10
127.0.0.1:6379> incrby num 5   # 15

# 批量设置 / 获取
127.0.0.1:6379> mset k1 v1 k2 v2
127.0.0.1:6379> mget k1 k2

典型场景: 缓存、计数器(点赞数/访问量)、Session 共享、分布式锁。

3.2 Hash(哈希)

Hash 是一个 Key 对应一个"字段-值"映射表,适合存储对象。

bash 复制代码
# 设置 / 获取单个字段
127.0.0.1:6379> hset user:1 name laogao age 25
127.0.0.1:6379> hget user:1 name      # "laogao"

# 批量获取 / 获取所有
127.0.0.1:6379> hmget user:1 name age
127.0.0.1:6379> hgetall user:1

# 判断字段是否存在 / 删除字段
127.0.0.1:6379> hexists user:1 name
127.0.0.1:6379> hdel user:1 age

# 获取所有字段名 / 所有值
127.0.0.1:6379> hkeys user:1
127.0.0.1:6379> hvals user:1

典型场景: 存储对象(如用户信息、商品信息),比 String 更节省内存且便于修改单个字段。

3.3 List(列表)

List 是双向链表,支持从两端插入/弹出,按插入顺序保存字符串。

bash 复制代码
# 从右侧(尾部)插入
127.0.0.1:6379> rpush list a b c

# 从左侧(头部)插入
127.0.0.1:6379> lpush list x y

# 查看列表
127.0.0.1:6379> lrange list 0 -1

# 从两端弹出
127.0.0.1:6379> lpop list        # 左侧弹出
127.0.0.1:6379> rpop list        # 右侧弹出

# 获取长度 / 指定下标元素
127.0.0.1:6379> llen list
127.0.0.1:6379> lindex list 0

典型场景: 消息队列、最新消息列表(时间线)、日志收集。

3.4 Set(集合)

Set 是无序、元素唯一的字符串集合。

bash 复制代码
# 添加元素
127.0.0.1:6379> sadd set1 a b c

# 查看集合成员
127.0.0.1:6379> smembers set1

# 判断成员是否存在
127.0.0.1:6379> sismember set1 a

# 删除成员
127.0.0.1:6379> srem set1 a

# 集合运算
127.0.0.1:6379> sadd set2 b c d
127.0.0.1:6379> sinter set1 set2      # 交集
127.0.0.1:6379> sunion set1 set2      # 并集
127.0.0.1:6379> sdiff set1 set2       # 差集

# 获取集合大小
127.0.0.1:6379> scard set1

典型场景: 去重(唯一用户/唯一 IP)、好友关系、共同关注、标签系统。

3.5 Sorted Set(有序集合,ZSet)

ZSet 在 Set 基础上给每个成员绑定一个 score(分数),按分数排序,可用于排行榜。

bash 复制代码
# 添加成员及分数
127.0.0.1:6379> zadd rank 100 zhangsan 90 lisi 80 wangwu

# 按分数升序查看(0 -1 表示全部)
127.0.0.1:6379> zrange rank 0 -1 withscores

# 按分数降序查看
127.0.0.1:6379> zrevrange rank 0 -1 withscores

# 给成员加分
127.0.0.1:6379> zincrby rank 10 lisi

# 获取成员排名(0 为最高)
127.0.0.1:6379> zrank rank zhangsan

# 获取成员分数
127.0.0.1:6379> zscore rank lisi

# 删除成员
127.0.0.1:6379> zrem rank wangwu

典型场景: 排行榜(热度榜/积分榜)、延迟队列、实时分数统计。

3.6 五大类型对比总结

类型 结构 有序 唯一性 典型场景
String 字符串/数字 否 --- 缓存、计数器
Hash 字段-值映射 否 --- 对象存储
List 双向链表 是 否 消息队列、时间线
Set 无序集合 否 是 去重、共同关注
ZSet 有序集合 是(按分数) 是 排行榜、延迟队列

第 4 章 Redis 通用命令与过期策略

4.1 通用 Key 操作命令

bash 复制代码
# 查看所有 Key(生产慎用,可用 SCAN 代替)
keys *

# 判断 Key 是否存在
exists name

# 设置过期时间(秒 / 毫秒)
expire name 60
pexpire name 60000

# 查看剩余生存时间
ttl name              # -1 表示永不过期,-2 表示已过期
pttl name

# 删除 Key
del name

# 清空当前库 / 清空所有库
flushdb
flushall

# 获取 Key 类型
type name

# 重命名
rename oldname newname

# 随机返回一个 Key
randomkey

4.2 数据库管理

bash 复制代码
# 查看当前库 Key 数量
dbsize

# 切换数据库
select 0

# 查看服务器信息
info
info memory
info replication

# 查看当前客户端连接
client list

4.3 过期删除策略

Redis 删除过期键采用三种策略组合:

  1. 惰性删除:访问 Key 时才检查是否过期,过期则删除;
  2. 定期删除:后台周期性地抽样检查并删除过期 Key;
  3. 内存淘汰 :内存达到上限(maxmemory)时,按淘汰策略(maxmemory-policy)清除 Key。

常用淘汰策略:

策略 说明
allkeys-lru 对所有键按最近最少使用淘汰
volatile-lru 对设置了过期时间的键按 LRU 淘汰
allkeys-random 对所有键随机淘汰
volatile-random 对有过期时间的键随机淘汰
volatile-ttl 优先淘汰剩余时间最短的键
noeviction 不淘汰,内存满时报错(默认)

第 5 章 Redis 持久化(RDB 与 AOF)

Redis 基于内存,为了防止重启后数据丢失,需要持久化。Redis 提供两种机制:RDB 快照 和 AOF 日志,可单独使用,也可同时开启。

5.1 RDB(Redis DataBase)快照持久化

RDB 把某一时刻的内存数据以二进制快照 形式保存到磁盘文件(默认 dump.rdb)。

触发方式:

  1. 手动触发:save(阻塞)或 bgsave(后台异步);
  2. 自动触发:按配置的保存条件(如 900 秒内 1 次修改)。
bash 复制代码
# 手动保存
127.0.0.1:6379> save
127.0.0.1:6379> bgsave

# 配置文件相关项
# save 900 1           # 900 秒内至少 1 次写操作则保存
# save 300 10          # 300 秒内至少 10 次写操作则保存
# save 60 10000        # 60 秒内至少 10000 次写操作则保存
# dbfilename dump.rdb
# dir /var/lib/redis

优点: 文件紧凑、恢复快、对性能影响小(异步)。

缺点: 可能丢失最后一次快照之后的少量数据;快照生成耗时(大内存场景)。

5.2 AOF(Append Only File)日志持久化

AOF 把每次写操作命令 以追加方式记录到日志文件(默认 appendonly.aof),重启时重放命令恢复数据。

bash 复制代码
# 开启 AOF
# appendonly yes
# appendfilename "appendonly.aof"

# 同步策略(appendfsync)
# always    每次写都同步,最安全但最慢
# everysec  每秒同步一次(默认,推荐)
# no        由系统决定,最快但最不安全

优点: 数据丢失少(根据同步策略),可读、可修复。

缺点: 文件比 RDB 大、恢复速度比 RDB 慢。

5.3 RDB 与 AOF 对比

对比项 RDB AOF
存储内容 内存快照(二进制) 写命令日志
文件大小 小、紧凑 大
恢复速度 快 慢
数据安全性 可能丢失较多数据 根据策略丢失少
对性能影响 异步生成影响小 写盘频率影响性能
优先级 低 高(同时开启时优先 AOF)

生产实践:同时开启 AOF(everysec)+ RDB,兼顾安全与恢复速度;Redis 4.0+ 支持 AOF+RDB 混合持久化,进一步优化。


第 6 章 Redis 主从复制

6.1 什么是主从复制

主从复制:一台主节点(Master)的数据自动同步到一台或多台从节点(Slave),从节点作为主节点的备份,分担读压力。

架构特点:

  • 一个主节点可以有多个从节点;
  • 从节点只能读,不能写(默认);
  • 主节点写数据后,异步同步到从节点;
  • 从节点挂了不影响主节点,主节点挂了需要手动/哨兵处理。

6.2 配置主从复制

方式一:配置文件(从节点)

bash 复制代码
# 在从节点 redis.conf 中配置
# replicaof <masterip> <masterport>
replicaof 192.168.108.10 6379
# 若主节点有密码
# masterauth 123456

方式二:命令行动态设置(从节点客户端)

bash 复制代码
# 在从节点上执行
127.0.0.1:6379> slaveof 192.168.108.10 6379

# 查看复制状态
127.0.0.1:6379> info replication
# role:slave
# master_host:192.168.108.10
# master_link_status:up

# 取消主从关系
127.0.0.1:6379> slaveof no one

主节点查看从节点信息:

bash 复制代码
127.0.0.1:6379> info replication
# role:master
# connected_slaves:1
# slave0:ip=192.168.108.11,port=6379,state=online

6.3 复制原理(文字描述)

  1. 从节点向主节点发送 PSYNC 同步请求;
  2. 主节点生成 RDB 快照发送给从节点,从节点加载快照(全量复制);
  3. 主节点把快照期间的写命令通过复制积压缓冲区发给从节点,从节点应用命令(增量复制);
  4. 之后主节点持续把新写命令推送给从节点,保持数据一致。

一句话概括:首次全量同步 RDB,之后增量同步写命令。


第 7 章 Redis 哨兵(Sentinel)高可用

7.1 为什么需要哨兵

主从复制解决了备份和读扩展,但主节点故障后无法自动恢复 。哨兵(Sentinel) 用于监控主从节点,实现主节点故障自动切换(故障转移),保证高可用。

7.2 哨兵的作用

功能 说明
监控(Monitoring) 持续监控主从节点运行状态
通知(Notification) 节点异常时通知管理员
自动故障转移(Failover) 主节点故障时自动提升一个从节点为新主节点
配置提供(Configuration) 客户端通过哨兵获取当前主节点地址

7.3 搭建哨兵(Sentinel)

bash 复制代码
# 1. 复制哨兵配置文件
cp sentinel.conf /etc/redis/sentinel.conf

# 2. 配置监控的主节点
vim /etc/redis/sentinel.conf
# sentinel monitor <名称> <主IP> <主端口> <quorum>
sentinel monitor mymaster 192.168.108.10 6379 2
# 主节点密码(若有)
# sentinel auth-pass mymaster 123456

# 3. 启动哨兵
redis-sentinel /etc/redis/sentinel.conf
# 或
redis-server /etc/redis/sentinel.conf --sentinel

# 4. 查看哨兵状态
redis-cli -p 26379 info sentinel
# sentinel_masters:1
# sentinel_myid:...

配置项说明: quorum(法定人数)表示至少几个哨兵同意主节点故障才会触发切换,一般建议哨兵数量为奇数(如 3 个哨兵,quorum=2)。

7.4 故障转移过程(文字描述)

  1. 哨兵通过 ping 心跳持续检测主节点;
  2. 主节点在 down-after-milliseconds 时间内无响应,哨兵标记其"主观下线";
  3. 达到 quorum 数量哨兵同意后,标记为"客观下线";
  4. 哨兵从所有健康的从节点中选出一个提升为新主节点(优先级、复制偏移量、运行 ID 综合评估);
  5. 其他从节点改为复制新主节点,客户端也被指引到新主节点。

一句话概括:哨兵投票确认主节点宕机 → 选举新主节点 → 通知所有从节点和客户端切换。


第 8 章 Redis 集群(Cluster)

8.1 什么是 Redis Cluster

单机 Redis 受内存和性能上限制约,Redis Cluster(集群) 提供数据分片(Sharding)+ 高可用的分布式方案:

  • 数据自动分片到多个节点(每个节点负责一部分哈希槽 slot);
  • 支持水平扩展(增加节点提升容量和性能);
  • 每个节点可配置主从,主节点故障自动切换。

8.2 哈希槽(Hash Slot)

Redis Cluster 共 16384 个哈希槽(slot) 。每个 Key 通过 CRC16(key) % 16384 计算出所属 slot,集群把这些 slot 分配到各个主节点上。

分配示例: 3 个主节点时,node1 管 0-5460、node2 管 5461-10922、node3 管 10923-16383。

8.3 搭建集群

bash 复制代码
# 1. 准备多个节点配置文件(每节点一个)
# 以 6 节点(3 主 3 从)为例,端口 7000-7005
# 每份 redis.conf 设置:
# port 7000
# cluster-enabled yes
# cluster-config-file nodes-7000.conf
# cluster-node-timeout 5000
# appendonly yes

# 2. 依次启动各节点
redis-server /etc/redis/7000.conf &
redis-server /etc/redis/7001.conf &
... # 7002-7005 同理

# 3. 创建集群(redis-cli --cluster 命令)
redis-cli --cluster create \
  192.168.108.10:7000 192.168.108.10:7001 192.168.108.10:7002 \
  192.168.108.10:7003 192.168.108.10:7004 192.168.108.10:7005 \
  --cluster-replicas 1
# 前 3 个为主,后 3 个为从,--cluster-replicas 1 表示每主 1 从

# 4. 查看集群状态
redis-cli -p 7000 cluster info
# cluster_state:ok
# cluster_slots_assigned:16384

# 5. 查看节点与槽分配
redis-cli -p 7000 cluster nodes

8.4 集群常用命令

bash 复制代码
# 集群信息
cluster info

# 集群节点列表
cluster nodes

# 添加主节点 / 从节点
redis-cli --cluster add-node 新节点IP:端口 现有节点IP:端口
redis-cli --cluster add-node 新节点IP:端口 现有节点IP:端口 --cluster-slave

# 删除节点(先迁移其槽位)
redis-cli --cluster del-node 节点IP:端口 node-id

# 重新分片 / 重新平衡
redis-cli --cluster reshard 现有节点IP:端口
redis-cli --cluster rebalance 现有节点IP:端口

8.5 集群注意事项

  • Key 通过哈希槽分布,跨节点无法直接执行多键操作(可用 hash tag 让相关 Key 落到同一槽);
  • 客户端(如 Jedis、Lettuce)需支持集群模式,自动路由到正确节点;
  • 集群模式下单节点宕机会触发该节点主从切换,保证可用性。

第 9 章 Redis 应用场景与最佳实践

9.1 典型应用场景

场景 使用的数据类型 说明
缓存 String 缓存热点数据,设置过期时间
计数器/限流 String 点赞、访问量、接口限流
排行榜 ZSet 按分数排序,实时更新
消息队列 List / Stream 简单队列用 List,可靠队列用 Stream
分布式锁 String SETNX + 过期时间实现
Session 共享 String/Hash 多实例共享登录态
关注/好友 Set 交并差集运算
购物车/对象 Hash 字段化管理

9.2 最佳实践建议

  1. 合理设计 Key :使用 业务:对象:ID 结构(如 user:1),避免过长 Key;
  2. 设置过期时间:避免无效 Key 长期占用内存;
  3. 控制 Key 数量:使用 SCAN 代替 KEYS,避免阻塞;
  4. 大 Key 治理:避免单个 Key 数据过大,影响性能与迁移;
  5. 合理淘汰策略 :根据业务选择 maxmemory-policy;
  6. 持久化选择:缓存场景可只开 RDB,核心数据开 AOF;
  7. 生产高可用:主从 + 哨兵,或集群部署。

总结

  1. Redis 本质:基于内存、单线程、支持多种数据结构的键值存储,读写极快。
  2. 五大类型:String(缓存/计数器)、Hash(对象)、List(队列)、Set(去重/集合运算)、ZSet(排行榜)。
  3. 过期与淘汰:惰性删除 + 定期删除,内存满时按淘汰策略清理。
  4. 持久化:RDB(快照,恢复快)+ AOF(日志,丢数据少),生产可混合开启。
  5. 主从复制:一主多从,读扩展 + 备份,全量同步 + 增量同步。
  6. 哨兵:监控主从、主节点故障自动切换,实现高可用。
  7. 集群:16384 哈希槽分片,水平扩展 + 每节点主从,支撑海量数据。

希望这份 Redis 教程对你有帮助,欢迎点赞收藏,有问题评论区交流~

相关推荐
abcyuu3 小时前
用友 U8 Cloud 生产制造模块深度解析:从 BOM 建立到成本核算的技术实现
前端·数据库·制造
夜雪一千3 小时前
MySQL 的ID用什么数据类型更好?主键ID选型实战
数据库·mysql
蓝胖的四次元口袋3 小时前
Redis 知识梳理(3)
数据库·redis·缓存
一铭111993 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
Lynne3093 小时前
TSN 在变电站自动化通信网络升级中的应用价值与技术挑战
服务器·网络·数据库
弈栈录3 小时前
用户、会话与消息表应该如何设计
数据库·后端
内存漫游3 小时前
Checkpoint 与 Crash Recovery:数据库恢复机制入门
数据库
2301_786756604 小时前
中科院分区表停发后,期刊评价的技术逻辑:从期刊超越指数到多指标选刊方案
java·数据库·windows