Redis 持久化

Redis是一种基于内存进行读写操作的Nosql数据库, 所以性能相对比较高. 但是如果数据始终保存在内存中没有持久化, 在服务器进行重启的时候那么数据将会丢失. 所以, Redis提供了持久化的解决方案. 这也是和Memcached的一个区别之一, Memcached是不提供持久化的.

持久化的方式

Redis采用三种方式进行持久化:

  • 快照方式(RDB): 将某一时刻的内存数据, 以二进制的方式写入磁盘

  • 文件追加的方式(AOF): 记录所有的操作命令, 并以文本行驶追加到文件中

  • 混合持久化: 在Redis 4.0之后, 混合持久化融合了RDB和AOF的有点, 在写入时先将当前数据以RDB的形式写入到文件的开头, 再将后续的操作命令以AOF的格式写入到文件中, 这样可以保证redis的重启速度又能降低数据丢失的风险.

RDB持久化

触发时机

手动触发

手动触发的操作有两个: save 和 bgsave.两者的区别主要是是否阻塞线程.

  • save: 会阻塞主线程, 主线程会切换到RDB持久化的任务中

  • bgsave: 不会阻塞主线程, bgsave(background save) 顾名思义主线程会fork一个子线程用于RDB持久化任务. 主线程只有在fork子线程的过程中会发生阻塞

自动触发

自动触发的来源有以下几种情况:

  • save m n: 指在m秒内n个key发生了变更, 触发RDB持久化. 我们可以在redis的配置文件中找到改设置.当满足条件是会自动触发一次bgsave命令.

  • 主从同步触发: 在redis主从复制中, 当从节点执行全量复制操作时, 主节点会执行bgsave, 并将RDB文件发送给从节点, 该过程会触发持久化.

配置

我们可以在redis的配置文件中找到相关的配置信息:

 RDB 保存的条件
save 900 1
save 300 10
save 60 10000
​
# bgsave 失败之后,是否停止持久化数据到磁盘,yes 表示停止持久化,no 表示忽略错误继续写文件。
stop-writes-on-bgsave-error yes
​
# RDB 文件压缩
rdbcompression yes
​
# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
rdbchecksum yes
​
# RDB 文件名
dbfilename dump.rdb
​
# RDB 文件目录
dir ./</pre>

RDB文件恢复

当服务启动时, redis会加载RDB文件dump.rdb, 恢复持久化数据. 所以启动时需要确认配置文件中指定的rdb文件目录是否有dump.rdb文件

RDB的优缺点

  1. 优点
    • RDB为二进制内容, 占用内存更小
    • RDB对灾难恢复非常有用, 可以更快的传输到远程服务器进行redis服务恢复
    • RDB可以更大程度的提高redis运行效率, 因为每次持久化时redis都会fork子线程进行持久化, 而主线程不会有磁盘的IO操作
    • 与AOF格式相比, RDB可以更快重启
  2. 缺点
    • RDB只能每隔一段时间持久化数据, 所以在触发持久化空窗期发生服务宕机, 会丢失一部分数据
    • RDB需要fork子线程才能进行持久化, 如果数据集很大, fork可能很耗时, 并且如果数据集很大且CPU性能不佳,可能导致Redis停止为客户端服务

AOF持久化

AOF的策略是对每个key的变更操作追加到日志文件中

触发时机

自动触发

两种情况可以出发AOF持久化, 分别是: 满足AOF设置的策略触发和满足AOF重写触发.

AOF策略触发:

  • always: 每条redis操作命令都会写入到磁盘中, 最多丢失一条数据
  • everysec: 每秒写入磁盘, 最多丢失一秒数据
  • no: 不设置写入规则, 根据当前操作系统来决定何时写入, Linux默认是每隔30秒
# 开启每秒写入一次的持久化策略
appendfsync everysec
手动触发

在客户端执行bgrewriteaof命令可以手动触发AOF持久化.

AOF重写

AOF通过记录redis的执行命令操作日志来记录日志, 时间越久AOF文件会越来越多, 不仅会增加存储压力在重启服务时, 重启速度也会变得很慢. 为了解决这个问题, redis提供了AOF重写功能.

什么是AOF重写

当我们设置一个值, 并对改值进行了100次操作, 显然会有101条操作记录. 所谓AOF重写就是减去中间的操作记录, 只记录最后一次操作的结果即可. 这样可以少掉很多不必要的中间结果记录.

AOF重写实现

在redis配置文件中配置相关配置:

  • auto-aof-rewrite-min-size:允许 AOF 重写的最小文件容量,默认是 64mb
  • auto-aof-rewrite-percentage:AOF 文件重写的大小比例,默认值是 100,表示 100%,也就是只有当前 AOF 文件,比最后一次(上次)的 AOF 文件大一倍时,才会启动 AOF 文件重写

AOF的重写流程是重新生成一个全新的文件, 并将当前数据的最少操作命令保存在新的文件上, 当所有数据都保存到新文件后, redis会交换两个文件, 并把最新的持久化操作命令追加到新文件上.

配置

# 是否开启 AOF,yes 为开启,默认是关闭
appendonly yes

# AOF 默认文件名
appendfilename "appendonly.aof"

# AOF 持久化策略配置
# appendfsync always
appendfsync everysec
# appendfsync no

# AOF 文件重写的大小比例,默认值是 100,表示 100%,也就是只有当前 AOF 文件,比最后一次的 AOF 文件大一倍时,才会启动 AOF 文件重写。
auto-aof-rewrite-percentage 100

# 允许 AOF 重写的最小文件容量
auto-aof-rewrite-min-size 64mb

# 是否开启启动时加载 AOF 文件效验,默认值是 yes,表示尽可能的加载 AOF 文件,忽略错误部分信息,并启动 Redis 服务。
# 如果值为 no,则表示,停止启动 Redis,用户必须手动修复 AOF 文件才能正常启动 Redis 服务。
aof-load-truncated yes

优缺点

  1. 优点
    • 持久化数据更完整, 提供三种策略: 每个操作持久化, 每隔1秒持久化, 跟随系统的持久化策略. 其中每隔一秒持久化是在系统安全和性能两方面权衡下来更好的选择
    • 采用命令追加的方式, 不会出现文件损坏问题, 即时由于某些意外原因, 导致持久化写入一般也可以通过redis-check-aof工具修复
    • 持久化文件方便理解和解析
  2. 缺点
    • 文件相对RDB要大
    • redis负载比较高的情况下, RDB比AOF性能更好
    • RDB使用快照形式来持久化整个redis数据库, AOF通过命令追加的方式. 理论上RDB健壮性更好

混合持久化

RDB和AOF各有利弊, 在新版本的redis中为了结合两者的优点退出了混合持久化的功能.

混合持久化的流程:


混合持久化流程

参考:
Redis 持久化——AOF

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在w...
    空语阅读 1,591评论 0 2
  • 企业级redis集群架构的特点 海量数据 高并发 高可用 要达到高可用,持久化是不可减少的,持久化主要是做灾难恢复...
    lucode阅读 2,191评论 0 7
  • 一、Redis持久化概述 持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永...
    心似南风阅读 909评论 0 1
  • 一. RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动出发和自动触发. ...
    唯爱熊阅读 488评论 0 0
  • 转自:https://www.toutiao.com/a6708324379190624782/ 使用 Redis...
    大鱼炖海棠阅读 431评论 0 1