深入理解Redis持久化

前言:最近在使用Redis实现了一个消息队列用作MQ中间件,开发过程中发现从Redis中获取的数据有时候会不准确,也没有作持久化与数据恢复,于是回去查阅了相关资料,也顺便做个总结。


持久化:
redis将数据从某种形式同步到硬盘中,使得重启后可以根据硬盘中的记录恢复数据,该过程即为持久化。

Redis持久化:redis支持两种方式的持久化,分别是RDB和AOF方式,RDB方式是根据指定规则定时将内存总的数据存储在硬盘上,AOF是在每次执行完命令后将命令本身记录下来,两者可以结合使用。

RDB:快照,当符合一定条件时,redis会自动将内存中的所有数据生成一份副本并存储在硬盘上,该过程即为快照。

redis进行快照的情况:

  • 根据配置规则进行自动快照:进行快照的条件可以在配置文件中自定义,由两个参数构成;时间窗口M和改动的键的个数N,每当时间M内被更改的键的个数大于N时,即符合自动快照条件,如:save 9001;15分钟(900秒)内有一个键被修改则进行

  • 用户执行SAVE或BGSAVE命令:

  • SAVE命令:执行该命令时,Redis同步进行快照操作,在快照执行过程中会阻塞所有来自客户端的请求,应尽量少用

  • BGSAVE命令:手动执行快照是推荐使用该命令,BGSAVE命令可以在后台异步进行快照操作,执行快照同时服务器还能继续相应来自客户端的请求,执行命令后redis会返回OK表示开始快照操作

  • 执行FLUSHALL命令:执行该命令时,redis会清楚数据库中的所有数据,前提是定义了自动快照条件

  • 执行复制(replication)时:设置主从模式时,redis会在复制初始化时进行自动快照

RDB快照原理:redis默认会将快照文件存储在redis当前进程的工作目录中的dump.rdb文件中,可以通过配置dir和dbfilename参数分别制定快照文件的存储路径和文件名,快照过程如下:

  • redis使用fork函数复制一份当前线程(父进程)的副本(子进程)父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中 临时文件当子进程写入完成所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。

  • 提示:执行fork时,操作系统会使用写时复制策略,即fork函数发生的一刻父子进程共享同一内存数据(虚拟内存不同,但物理内存相同),当父进程更改其中某片数据时(如执行一个写命令),操作系统会将该片数据复制一份以保证子进程的数据不受影响,因此新的RDB文件存储的是执行fork一刻的内存数据

  • 写时复制策略:
    fork子进程完全复制父进程的栈空间,也复制了页表,但没有复制物理页面,所以这时虚拟地址相同,物理地址也相同,但是会把父子共享的页面标记为“只读”(类似mmap的private的方式),如果父子进程一直对这个页面是同一个页面,知道其中任何一个进程要对共享的页面“写操作”,这时内核会复制一个物理页面给这个进程使用,同时修改页表。而把原来的只读页面标记为“可写”,留给另外一个进程使用。

AOF方式:当使用redis存储非临时数据时,一般需要打开AOF持久化来降低进程中止导致的数据丢失。

  • 开启AOF:默认情况下redis没有开启AOF方式的持久化,可以通过命令:appendonly yes 开启AOF持久化,开启后每执行一条会更改redis中的数据的命令,redis就会将该命令写入硬盘中的AOF文件,AOF文件的保存位置与RDB文件的位置相同,都是通过dir参数设置,默认文件名是appendonly.aof。

  • AOF实现:AOF文件以纯文本的形式记录redis的执行写命令,内容为原始的通信协议内容。

  • 同步硬盘数据:由于操作系统的缓存机制,AOF文件数据先进入系统的硬盘缓存,在默认情况下系统会每30秒会执行一次同步操作,以便将硬盘缓存中的内容真正地写入硬盘,在这30秒中的过程中如果系统异常退出则会导致硬盘缓存中的数据丢失,为此在redis中可以通过appendfsync参数设置同步的时机:#appendfsync always
    appendfsync everysec
    #appendfsync no

  • 默认情况下,redis采用everysec规则,即每秒执行一次同步操作,always表示每次执行写入都会执行同步,最安全也是最慢, no表示不主动进行同步操作而是跟随操作系统,最快也是最不安全

  • redis允许同时使用AOF和RDB,既能保证数据安全又使得备份操作简化,此时重新启动时redis会使用AOF文件来恢复数据。


参考书籍:
1.《Redis设计与实现》
2.《Redis入门指南》

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

推荐阅读更多精彩内容