关系型数据库 vs 非关系型数据库
开源、C 语言编写、基于内存、支持持久化的键值数据库。高性能:读取可达 110000 次/s,写入 81000 次/s数据结构丰富:string、list、hash、sets、sorted sets支持持久化:数据可保存到磁盘原子性:单线程避免并发锁问题主从复制:数据备份为什么快?1. 纯内存操作 → 避免磁盘 IO2. 单线程 → 避免锁开销3. I/O 多路复用 → 高并发秒杀活动:库存扣减、
目录
1. 关系型数据库(SQL)
- 特点:
- 表格模型(行 + 列)
- 使用 SQL 语言
- 数据必须符合表结构
- 强事务 ACID
- 纵向扩展(升级硬件)
- 常见产品:MySQL、Oracle、PostgreSQL
- 举例:
- 银行转账:A 转账给 B,必须保证 A 扣钱成功的同时 B 收钱成功(事务保证一致性)。
2. 非关系型数据库(NoSQL)
- 特点:
- 键值对 / 文档 / 图结构存储
- 无需固定表结构
- 高并发、高可扩展
- 横向扩展(增加服务器节点)
- 常见产品:Redis、MongoDB、HBase、Memcached
- 举例:
微信聊天:一条消息可能是文字、图片、语音,不适合用表格存储,更适合用文档型数据库。
3.Redis 简介
- 定义:开源、C 语言编写、基于内存、支持持久化的键值数据库。
- 特性:
- 高性能:读取可达 110000 次/s,写入 81000 次/s
- 数据结构丰富:string、list、hash、sets、sorted sets
- 支持持久化:数据可保存到磁盘
- 原子性:单线程避免并发锁问题
- 主从复制:数据备份
- 为什么快?
- 1. 纯内存操作 → 避免磁盘 IO
- 2. 单线程 → 避免锁开销
- 3. I/O 多路复用 → 高并发
- 举例:
- 秒杀活动:库存扣减、订单写入,放到 Redis 避免数据库压力。
- 抖音热搜榜:用 sorted set 存储关键词 + 热度,实时排序。
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
4.Redis 安装与部署
redis 下载地址:http://download.redis.io/releases/
4.1安装流程



4.2 配置文件参数
- bind 127.0.0.1 → 指定监听 IP
- port 6379 → 默认端口
- daemonize yes → 守护进程模式
- logfile /var/log/redis.log → 日志路径
- requirepass 123456 → 密码
举例:
Redis 就像一个仓库 → bind 是仓库大门只允许谁进,port 是大门编号,daemonize 表示仓库是否一直有人值守,requirepass 是仓库的锁。
5.Redis 命令工具
登录:
redis-cli -h host -p port -a password
- -h :指定远程主机
- -p :指定 Redis 服务的端口号
- -a :指定密码,未设置数据库密码可以省略-a 选项
- 若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库
6.Redis 常用命令



7.Redis 高可用
1. 持久化
- 持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
- 保证断电后数据不丢失。
2. 主从复制
- 一主多从,主写从读。
- 案例:微博数据 → 主库负责写入热搜,从库负责提供用户查询,分担压力。
主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。
缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
3. 哨兵(Sentinel)
- 主机宕机,自动切换到从机。
- 案例:快递站点 A 停电,哨兵会自动切换到站点 B,业务不中断。
在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限制。
4. Cluster 集群
- 多节点分片存储,解决单机内存限制。
- 案例:淘宝商品太多,单机放不下,按分类拆分到不同 Redis 节点。
通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
8.持久化机制
8.1RDB 持久化
8.1.1RDB(快照)
- 定期把数据快照保存到磁盘。
- 优点:文件小,恢复快。
- 缺点:可能丢几分钟数据。
- 案例:手机云备份,每天定时备份一次照片。
8.2 触发条件
RDB持久化的触发分为手动触发和自动触发两种
8.2.1 手动触发
save命令和bgsave命令都可以生成RDB文件。
save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求。而bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处理请求。
bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用。
8.2.2 自动触发
在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化。
save m n
自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。


1. Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof的子进程,如果在执行则
bgsave命令直接返回。 bgsave/bgrewriteaof的子进程不能同时执行,主要是基于性能方面的考
虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。
2. 父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
3. 父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令
4. 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换
5. 子进程发送信号给父进程表示完成,父进程更新统计信息
8.4启动时加载
RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入 AOF文件来恢复数据;只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。
Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败
9.AOF 持久化
RDB持久化是将进程数据写入文件,而AOF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录; 当Redis重启时再次执行AOF文件中的命令来恢复数据。与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案
9.1 开启AOF

9.2 执行流程
由于需要记录Redis的每条写命令,因此AOF不需要触发,下面介绍AOF的执行流程。

AOF的执行流程包括:
- 命令追加(append):将Redis的写命令追加到缓冲区aof_buf;
- 文件写入(write)和文件同步(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘;
- 文件重写(rewrite):定期重写AOF文件,达到压缩的目的。
(1)命令追加(append)
Redis先将写命令追加到缓冲区,而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘IO成为Redis负载的瓶颈。
命令追加的格式是Redis命令请求的协议格式,它是一种纯文本格式,具有兼容性好、可读性强、容易处理、操作简单避免二次开销等优点。在AOF文件中,除了用于指定数据库的select命令(如select 0为选中0号数据库)是由Redis添加的,其他都是客户端发送来的写命令。
(2)文件写入(write)和文件同步(sync)
Redis提供了多种AOF缓存区的同步文件策略,策略涉及到操作系统的write函数和fsync函数,说明如下:
为了提高文件写入效率,在现代操作系统中,当用户调用write函数将数据写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区被填满或超过了指定时限后,才真正将缓冲区的数据写入到硬盘里。这样的操作虽然提高了效率,但也带来了安全问题:如果计算机停机,内存缓冲区中的数据会丢失;因此系统同时提供了fsync、fdatasync等同步函数,可以强制操作系统立刻将缓冲区中的数据写入到硬盘里,从而确保数据的安全性。
appendfsync always: 命令写入aof_buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次有写命令都要同步到AOF文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。
总结:一直触发aof的持久化(每执行一次一条语句就触发一次持久化)
● appendfsync no: 命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。
总结: 不进行持久化
● appendfsync everysecond: 命令写入aof_buf后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次。everysec是前述两种策略的折中,是性能和数据安全性的平衡,因此是Redis的默认配置,也是我们推荐的配置。
总结:每秒触发一次
(3)文件重写(rewrite)
随着时间流逝,Redis服务器执行的写命令越来越多,AOF文件也会越来越大;过大的AOF文件不仅会影响服务器的正常运行,也会导致数据恢复需要的时间过长。
文件重写是指定期重写AOF文件,减小AOF文件的体积。需要注意的是,AOF重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作!
关于文件重写需要注意的另一点是:对于AOF持久化来说,文件重写虽然是强烈推荐的,但并不是必须的;即使没有文件重写,数据也可以被持久化并在Redis启动的时候导入;因此在一些现实中,会关闭自动的文件重写,然后通过定时任务在每天的某一时刻定时执行。
10. RDB和AOF的优缺点
10.1 RDB持久化
- 优点:RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比,RDB最重要的优点之一是对性能的影响相对较小。
- 缺点:RDB文件的致命缺点在于其数据快照的持久化方式决定了必然做不到实时持久化,而在数据越来越重要的今天,数据的大量丢失很多时候是无法接受的,因此AOF持久化成为主流。此外,RDB文件需要满足特定格式,兼容性差(如老版本的Redis不兼容新版本的RDB文件)。对于RDB持久化,一方面是bgsave在进行fork操作时Redis主进程会阻塞,另一方面,子进程向硬盘写数据也会带来IO压力
10.2 AOF持久化
- 优点:支持秒级持久化、兼容性好
- 缺点:文件大、恢复速度慢、对性能影响大。
对于AOF持久化,向硬盘写数据的频率大大提高(everysec策略下为秒级),IO压力更大,甚至可能造成AOF追加阻塞问题。AOF文件的重写与RDB的bgsave类似,会有fork时的阻塞和子进程的IO压力问题。相对来说,由于AOF向硬盘中写数据的频率更高,因此对 Redis主进程性能的影响会更大。
更多推荐


所有评论(0)