Redis实现持久化

一、为什么需要持久化

Redis是内存数据库,数据默认只存在内存中。一旦进程崩溃或机器宕机,内存数据全部丢失。持久化的作用就是把内存数据存储到磁盘中,让Redis在故障重启后能从磁盘恢复数据

Redis提供的两种持久化方案:

RDB :数据快照

AOF:命令日志

二、RDB持久化

RDB全称Redis Database Backup file,也叫Redis数据快照。就是把内存中的所有数据记录到磁盘中,生成一个二进制文件(默认dump.rdb,保存在当前运行目录)。当Redis实例故障重启后,从磁盘读取快照文件恢复数据。

2.1 执行时机

RDB持久化在四种情况下会执行

  1. 执行save命令
    save 会让主进程同步执行 RDB,这个过程中其它所有命令都会被阻塞。因为阻塞严重,生产环境基本不用,只在数据迁移等特殊场景可能用到。
    执行下面的命令,可以立即执行一次RDB:

    可以看到,save 命令返回 OK,说明快照执行成功。
    执行完成后,RDB 快照文件会保存到 Redis 配置的 dir 目录下(默认是启动时的工作目录),文件名由 dbfilename 指定(默认 dump.rdb)
  2. 执行bgsave命令
    bgsave会fork一个子进程异步完成RDB,主进程继续处理用户请求,不收影响。这是最重用的手动触发方式。
  3. Redis停机时
    Redis停机时会执行一次save命令。实现RDB持久化。
  4. 触发RDB条件时
    Redis内部有自动触发机制,配置在redis.conf中:
properyies 复制代码
# 900秒内,如果至少有1个key被修改,则执行bgsave
# 如果是 save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000

以 save 60 10000 为例:60 秒内至少有 10000 个 key 被修改,就自动执行 bgsave。

其他相关配置:

properties 复制代码
# 是否压缩,建议不开启,压缩会消耗CPU,磁盘不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb

# 文件保存的路径目录
dir  ./

2.2 RDB原理

bgsave开始时,会fork主进程得到一个子进程,子进程共享主进程的内存数据。完成fork后,子进程读取内存数据并写入RDB文件。

fork采用的是copy-on-write(写时复制)技术:

  • fork后,父子进程的页表各自独立,但都指向同一批物理内存也,这些页被标记为只读;
  • 当主进程读某页时,直接访问共享内存;
  • 当主进程写某页时,触发写保存缺页异常,内核复制该物理页并让主进程指向新页,然后完成写操作;
  • 未被写的页继续共享

三、AOF持久化

AOF全场 Append Only file(追加文件)。Redis处理的每一个写命令都会记录在aof文件中,可以看做是命令日志文件。恢复时逐条重放命令来重建数据。

3.1 AOF配置

AOF 默认关闭,需要修改 redis.conf 开启:

properties 复制代码
#是否开启AOF功能,默认是no
appendonly yes

# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:

properties 复制代码
#表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

三种策略对比:

3.2 AOF文件重写

因为记录的是命令,AOF文件会比RDB文件大得多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。

如 AOF 原本有三条命令:

xml 复制代码
set num 123
set num 666
set name jack

前两条都是对 num 的操作,第二次覆盖第一次,第一条没有意义。执行重写后,AOF 内容可以简化为:

xml 复制代码
mset name jack num 666

通过执行 bgrewriteaof命令,可以让AOF文件执行重写功能,用最少得命令达到相同效果。重写也是fork子进程完成,不会阻塞主进程。

Redis 也会在触发阈值时自动重写 AOF,阈值可在 redis.conf 配置:

xml 复制代码
#AOF文件比上次增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
#AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

四、RDB与AOF对比

redis-6.2.4版本,需要的请下载:

链接: https://pan.baidu.com/s/1_eOjFsPYWxlGILFF3cH8HA?pwd=8888

相关推荐
余槐i1 小时前
PostgreSQL 加索引后查询反而更慢:优化器弃用索引的 3 种情形
spring boot·redis·mysql·postgresql·事务
我不会起名字3221 小时前
Redis 从 0 到 1(十三):分布式锁被误删、锁不住?Go 无 Lua 实现 3 级防御
redis·go·分布式锁·watch·setnx
z06.1 小时前
MySQL存储引擎
数据库·mysql
小徐不徐说1 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
JackLam2 小时前
Gitea HTTPS 反向代理配置
数据库
量子物理学2 小时前
oracle plsql instantclient 安装
数据库·oracle
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
ClickHouseDB10 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_6399069410 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis