Redis 从入门到实战:核心知识点与架构搭建全解析
文章目录
Redis 从入门到实战:核心知识点与架构搭建全解析
Redis 是一款基于内存、高性能的键值型 NoSQL 数据库,广泛用于缓存、分布式锁、消息队列、排行榜、LBS 服务等场景。本文从基础原理、额外核心知识点、环境部署、常用命令、数据类型、Python 实战、高可用架构全维度详细梳理,内容完整可直接用于学习、面试与博客发布。
一、Redis 基础简介
- Redis 核心架构:对外客户端多线程,对内服务端单线程。
- 基于内存操作,读写性能极高,单机可支撑 10W+ QPS。
- 支持数据持久化(RDB + AOF)、主从复制、哨兵、集群等高可用能力。
- 默认端口:6379
- 默认数据库:16 个(0~15),默认使用 0 号库。
二、Redis 额外核心知识点(面试/实操必背)
2.1 实时通信三大方案:推送、轮询、长轮询
(1)通知(主动推送)
- 核心逻辑:服务端有新消息时,主动把数据推送给客户端,无需客户端反复询问。
- 常见实现:WebSocket、Server-Sent Events(SSE)
- 特点
- 实时性最好,消息到达立即推送。
- 需要保持长连接,服务端维护连接状态。
- 占用连接资源较高。
- 适用场景:在线聊天、系统实时通知、弹幕、股票行情。
(2)轮询(短轮询)
- 核心逻辑:客户端每隔固定时间主动发 HTTP 请求询问服务端是否有新数据。
- 执行流程
- 客户端发送请求
- 服务端立即返回(有数据则返回,无数据返回空)
- 客户端等待间隔时间,再次发起请求
- 特点
- 实现最简单,纯 HTTP 即可完成。
- 实时性差,延迟由轮询间隔决定。
- 无效请求极多,服务端压力大。
- 适用场景:对实时性要求低、需要快速上线的简单页面。
(3)长轮询(Long Polling)
- 核心逻辑:客户端发送请求后,服务端不立即响应,将请求挂起;直到有新消息或超时才返回,返回后客户端立即重连。
- 执行流程
- 客户端请求 → 服务端挂起请求(hold 住)
- 有新消息 / 请求超时 → 服务端返回数据
- 客户端收到响应后立刻重新发起请求
- 特点
- 实时性接近主动推送。
- 基于标准 HTTP,兼容性比 WebSocket 更好。
- 服务端需维护大量挂起连接,有一定资源开销。
- 适用场景:不支持 WebSocket 的旧浏览器、受限网络环境、内网系统。
2.2 交换机(Switch)
(1)核心定义
交换机是局域网内的数据转发设备,负责在同一内网中精准转发数据包,仅工作在内网,不能直接连接外网。
(2)通俗比喻
大楼里的快递分拣员:
- 多台设备(电脑、服务器、手机)通过网线连接交换机。
- 设备 A 发数据给设备 B,交换机根据 MAC 地址 直接转发给目标设备。
- 不会广播给所有设备,减少网络拥堵。
(3)核心特点
- 精准转发:维护 MAC 地址与端口映射表,只发给目标设备。
- 内网专用:无法拨号上网,不能访问外网。
- 扩展网口:提供多端口(4/8/16/24口),让多设备接入同一局域网。
2.3 套接字(Socket)
(1)一句话理解
Socket = 网络通信的端点/接口,是两台设备跨网络收发数据的唯一出入口。
(2)通俗比喻
两台设备互相通信:
- IP 地址 = 房子地址(定位主机)
- 端口号 = 房间门号(定位主机上的应用程序)
- Socket = 收发消息的那扇门
(3)核心组成
一个完整 Socket = IP 地址 + 端口号
无论服务端、客户端、浏览器,都必须通过 Socket 完成网络通信。
2.4 C/S 与 B/S 架构
- C/S(Client/Server):客户端/服务器架构
- 需要安装专用客户端(如 Redis 客户端、QQ、微信)
- 性能更高,功能更强
- Redis 属于典型 C/S 架构
- B/S(Browser/Server):浏览器/服务器架构
- 只需浏览器即可访问(如网页、后台管理系统)
- 部署维护更简单
三、Redis 虚拟机安装部署(超详细步骤)
3.1 环境准备
- 安装 C 语言编译环境
gcc(Redis 由 C 语言开发) - 永久关闭防火墙(避免外部无法连接)
# 临时关闭防火墙
systemctl stop firewalld
# 永久禁用防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
3.2 下载与安装
- 下载 Redis 稳定版(不建议最新版)
- 解压压缩包
tar -zxvf redis-xxx.tar.gz
- 进入目录编译安装
cd redis-xxx
make && make install
- 出现
make install成功提示即安装完成。
3.3 核心配置文件修改
- 复制默认配置文件备用
cp redis.conf redis.conf.bak
- 编辑
redis.conf,修改以下关键项:
- 注释
bind 127.0.0.1→ 允许所有 IP 连接 protected-mode no→ 关闭保护模式,允许外部连接daemonize yes→ 后台守护进程启动port 6379→ 默认端口,保持不变databases 16→ 默认 16 个库
3.4 启动与验证
# 启动 Redis 服务(指定配置文件)
redis-server redis.conf
# 查看 Redis 进程
ps -ef | grep redis
# 连接 Redis 客户端
redis-cli -p 6379
# 测试
ping
# 返回 PONG 说明连接正常
四、Redis 常用命令(完整详细)
4.1 全局通用命令
keys *:查看所有键(生产不推荐)del key1 key2:删除指定键expire key seconds:设置键过期时间ttl key:查看键剩余存活时间type key:查看键的数据类型
4.2 字符串(String)命令
set key value:设置键值(存在则覆盖)setnx key value:仅键不存在时设置(用于分布式锁)get key:获取值mset k1 v1 k2 v2:批量设置mget k1 k2:批量获取incr key:值自增 +1(原子操作)decr key:值自减 -1incrby key n:增加指定数值decrby key n:减少指定数值
五、Redis 五大核心数据类型(完整详解)
5.1 String(字符串)—— 最常用
- 结构:简单 key-value
- 可存内容:数字、字符串、JSON 串、二进制
- 核心命令:
set/get/incr/expire - 使用场景:缓存、分布式锁、计数器、Session、验证码
5.2 Hash(哈希)—— 存储对象
- 结构:key → {field1:value1, field2:value2}
- 特点:适合存储结构化对象
- 核心命令:
hset/hget/hgetall/hkeys/hvals - 场景:用户信息、商品详情、配置信息
5.3 List(列表)—— 有序可重复
- 结构:有序、可重复、双向链表
- 操作:支持左右两边插入/弹出
- 核心命令:
lpush/rpush/lpop/rpop/lrange - 场景:消息队列、朋友圈时间线、任务队列
5.4 Set(集合)—— 无序不重复
- 结构:无序、自动去重
- 核心命令:
sadd/smembers/sismember/sinter/sunion - 场景:点赞、收藏、共同好友、随机抽奖、去重
5.5 ZSet(有序集合)—— 带分数排序
- 结构:每个元素带
score分数,按分数自动排序 - 特点:不重复、有序
- 核心命令:
zadd/zrange/zrevrange/zrank - 场景:排行榜、热度排序、延时队列、优先级队列
六、Redis 扩展数据类型(完整版)
6.1 Bitmap(位图)
- 用二进制 bit 位存储状态(0/1)
- 极省内存:1 亿数据仅占约 12MB
- 场景:用户签到、打卡、状态标记、布隆过滤器
6.2 HyperLogLog
- 仅用于海量数据去重计数
- 固定内存 12KB,可统计 2^64 数据
- 标准误差 0.81%
- 场景:网站 UV、独立访客、日活统计
6.3 Geo(地理位置)
- 存储经纬度,计算距离,查找附近位置
- 底层:ZSet + Geohash
- 场景:附近门店、附近人、网约车、外卖配送
6.4 Stream
- Redis 官方原生消息队列
- 支持消息持久化、消费组、回溯消费
- 场景:日志采集、消息推送、异步任务队列
七、Redis 在 Python 中的使用
7.1 安装依赖
pip install redis
7.2 基础连接
import redis
# 连接 Redis
r = redis.Redis(
host="192.168.x.x",
port=6379,
decode_responses=True # 自动解码为字符串
)
r.set("name", "张三")
print(r.get("name"))
7.3 连接池(推荐生产使用)
import redis
# 创建连接池
pool = redis.ConnectionPool(
host="192.168.x.x",
port=6379,
decode_responses=True,
max_connections=20
)
# 从连接池获取连接
r = redis.Redis(connection_pool=pool)
# Hash 示例
r.hset("user:100", mapping={"name":"李四","age":22})
print(r.hgetall("user:100"))
八、redis线程模型简单解析
- Redis的整体线程模型可以简单解释为客户端多线程,服务端单线程
- 具体流程图:

- Selector(多路复用器)是 I/O 多路复用模型 的核心组件,它的作用是用一个线程同时管理多个 I/O 连接,大幅提升服务端的并发处理能力。
九、redis事务
Redis 事务 = 批量执行命令 + 一次性提交,保证命令不被打断 ,但不支持回滚。
核心命令:
MULTI(multi):开启事务(相当于 开始)
EXEC(exec):执行事务(相当于 提交)
DISCARD(discard):放弃事务(相当于 取消,或者说回滚),清空当前事务里排队的命令,直接取消这次事务。
注意事项
-
1.如果报错:
-
语法错误(入队阶段报错):整个事务直接作废,什么都不执行。
运行时错误(执行阶段报错):事务继续执行,只有报错的那条命令会因为执行失败取消,其他事务中的命令正常执行
-
十、redis的持久化
持久化的常规命令:save and bgsave
- 具体信息如下:

1.RDB(快照 / 拍照)
原理:每隔一段时间,就把内存全量数据拍成一个二进制文件 dump.rdb。
-
好比:游戏存档,存的是某一刻的完整状态。
-
触发:
- 配置:
save 300 10(5 分钟 10 个 key 变,就存一次) - 手动:
BGSAVE(后台,不卡主线程)/SAVE(阻塞)
- 配置:
-
优点:文件小、恢复快、适合备份
-
缺点:丢最后一次快照后的数据(可能丢几分钟)
-
具体的运用使用截图:
-
1.改redis.conf文件内容,去掉#号
-

-
测试使用配置(仅用于测试基础功能,在真正的项目中,一般使用默认设置,只需要去掉#即可)
-

-
2.敲命令,先启动redis,然后执行具体队列操作
-
运行示例图:
-

2. AOF(日志 / 录屏)
原理:把每一条写命令(set/del/incr…)追加到日志文件 appendonly.aof文件末尾。
-
关键参数:
auto-aof-rewrite-percentage:控制增长多少比例触发重写auto-aof-rewrite-min-size:控制文件至少多大才触发重写俩个参数条件必须同时满足才会重写,目的都是为了控制 AOF 文件体积,同时避免不必要的重写
-
好比:监控录像,记录所有操作过程。
-
刷盘策略(决定丢多少):
-
always:每条命令都刷盘 → 最安全、最慢 -
everysec:每秒刷一次 → 默认,最多丢 1 秒 -
no:交给系统 → 最快、最不安全 -
优点:数据几乎不丢、安全性高
-
缺点:文件大、重启恢复慢(要重放所有命令)
3. 混合持久化(Redis 4.0+,推荐)
-
RDB + AOF 结合:
- 先写一段 RDB 全量数据(快、小)
- 后面跟 AOF 增量命令(安全)
-
重启:先加载 RDB,再重放少量 AOF → 又快又安全
十一、Redis 高可用架构
10.1 主从复制
(1)核心作用
- 数据备份
- 读写分离(主写从读)
- 分担读请求压力
(2)角色规则
- Master(主节点):可读可写
- Slave(从节点):只读不可写,自动同步主库数据
(3)主从复制搭建流程图
10.2 负载均衡算法
- 轮询算法
- 按顺序轮流分配请求
- 实现最简单,请求均匀
- 不考虑服务器性能差异
- 随机算法
- 随机选择一台服务器
- 实现简单,流量近似均匀
- 一致性 Hash 算法
- 将服务器与请求映射到哈希环
- 增减节点仅少量缓存失效
- 通常加虚拟节点避免分配不均
10.3 哨兵模式(Sentinel)—— 高可用核心
(1)核心作用
监控主从节点状态,主节点故障时自动切换,保证服务高可用。
(2)哨兵工作完整流程(图解)
(3)哨兵配置步骤
- 复制
sentinel.conf - 修改核心配置:
sentinel monitor mymaster 主节点IP 6379 1
sentinel down-after-milliseconds mymaster 30000
- 启动哨兵:
redis-sentinel sentinel.conf
十二、完整总结
- 基础:Redis 服务端单线程、客户端多线程,高性能内存数据库。
- 通信:主动推送、短轮询、长轮询适用不同实时场景。
- 网络:交换机负责内网转发,Socket = IP + 端口。
- 部署:安装 gcc → 关闭防火墙 → 修改配置 → 后台启动。
- 数据:5 种核心类型 + 4 种扩展类型覆盖绝大多数业务。
- 客户端:Python 连接 + 连接池提升性能。
- 高可用:主从复制实现读写分离,哨兵实现自动故障切换。
更多推荐


所有评论(0)