文章目录

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)
  • 特点
    1. 实时性最好,消息到达立即推送。
    2. 需要保持长连接,服务端维护连接状态。
    3. 占用连接资源较高。
  • 适用场景:在线聊天、系统实时通知、弹幕、股票行情。
(2)轮询(短轮询)
  • 核心逻辑:客户端每隔固定时间主动发 HTTP 请求询问服务端是否有新数据。
  • 执行流程
    1. 客户端发送请求
    2. 服务端立即返回(有数据则返回,无数据返回空)
    3. 客户端等待间隔时间,再次发起请求
  • 特点
    1. 实现最简单,纯 HTTP 即可完成。
    2. 实时性差,延迟由轮询间隔决定。
    3. 无效请求极多,服务端压力大。
  • 适用场景:对实时性要求低、需要快速上线的简单页面。
(3)长轮询(Long Polling)
  • 核心逻辑:客户端发送请求后,服务端不立即响应,将请求挂起;直到有新消息或超时才返回,返回后客户端立即重连。
  • 执行流程
    1. 客户端请求 → 服务端挂起请求(hold 住)
    2. 有新消息 / 请求超时 → 服务端返回数据
    3. 客户端收到响应后立刻重新发起请求
  • 特点
    1. 实时性接近主动推送。
    2. 基于标准 HTTP,兼容性比 WebSocket 更好。
    3. 服务端需维护大量挂起连接,有一定资源开销。
  • 适用场景:不支持 WebSocket 的旧浏览器、受限网络环境、内网系统。

2.2 交换机(Switch)

(1)核心定义

交换机是局域网内的数据转发设备,负责在同一内网中精准转发数据包,仅工作在内网,不能直接连接外网

(2)通俗比喻

大楼里的快递分拣员

  • 多台设备(电脑、服务器、手机)通过网线连接交换机。
  • 设备 A 发数据给设备 B,交换机根据 MAC 地址 直接转发给目标设备。
  • 不会广播给所有设备,减少网络拥堵。
(3)核心特点
  1. 精准转发:维护 MAC 地址与端口映射表,只发给目标设备。
  2. 内网专用:无法拨号上网,不能访问外网。
  3. 扩展网口:提供多端口(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 环境准备

  1. 安装 C 语言编译环境 gcc(Redis 由 C 语言开发)
  2. 永久关闭防火墙(避免外部无法连接)
# 临时关闭防火墙
systemctl stop firewalld
# 永久禁用防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld

3.2 下载与安装

  1. 下载 Redis 稳定版(不建议最新版)
  2. 解压压缩包
tar -zxvf redis-xxx.tar.gz
  1. 进入目录编译安装
cd redis-xxx
make && make install
  1. 出现 make install 成功提示即安装完成。

3.3 核心配置文件修改

  1. 复制默认配置文件备用
cp redis.conf redis.conf.bak
  1. 编辑 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:值自减 -1
  • incrby 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)主从复制搭建流程图

配置主节点 redis.conf

启动主节点 redis-server

配置从节点

方式1:配置文件添加 slaveof 主IP 6379

方式2:客户端执行 slaveof 主IP 6379

启动从节点

主从全量同步数据

验证:主写数据 → 从节点可读取

10.2 负载均衡算法

  1. 轮询算法
    • 按顺序轮流分配请求
    • 实现最简单,请求均匀
    • 不考虑服务器性能差异
  2. 随机算法
    • 随机选择一台服务器
    • 实现简单,流量近似均匀
  3. 一致性 Hash 算法
    • 将服务器与请求映射到哈希环
    • 增减节点仅少量缓存失效
    • 通常加虚拟节点避免分配不均

10.3 哨兵模式(Sentinel)—— 高可用核心

(1)核心作用

监控主从节点状态,主节点故障时自动切换,保证服务高可用。

(2)哨兵工作完整流程(图解)

哨兵定时 PING 主/从节点

单个哨兵判定主节点宕机?

主观下线

超过 quorum 数量哨兵同意?

客观下线

选举哨兵 Leader

执行故障转移

从从节点中选数据最新、优先级最高的节点

将该从节点升级为新主节点

其他从节点指向新主

通知客户端新主地址

(3)哨兵配置步骤
  1. 复制 sentinel.conf
  2. 修改核心配置:
sentinel monitor mymaster 主节点IP 6379 1
sentinel down-after-milliseconds mymaster 30000
  1. 启动哨兵:
redis-sentinel sentinel.conf

十二、完整总结

  1. 基础:Redis 服务端单线程、客户端多线程,高性能内存数据库。
  2. 通信:主动推送、短轮询、长轮询适用不同实时场景。
  3. 网络:交换机负责内网转发,Socket = IP + 端口。
  4. 部署:安装 gcc → 关闭防火墙 → 修改配置 → 后台启动。
  5. 数据:5 种核心类型 + 4 种扩展类型覆盖绝大多数业务。
  6. 客户端:Python 连接 + 连接池提升性能。
  7. 高可用:主从复制实现读写分离,哨兵实现自动故障切换。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐