Redis 持久化 RDB(Redis database)

丁仪
• 阅读 163

redis的数据如果服务器突然宕机,数据就会全部丢失,因此必须有一种手段来处理因为宕机而不会丢失数据,这种机制就是redis持久化。
redis持久化有两种,一种是 aof日志,一种是rdb(快照),本文介绍 rdb。

通过上一章的学习,我们知道了 aof 是 以日志记录redis的执行命令,那么在宕机的恢复的时候,如果aof文件很大,那么恢复起来也会很慢,那么有没有什么好的办法吗,那就是 RDB, RDB是以二进制的方式记录,当恢复的的时候会直接加载到内存,恢复速度会很快。

一、redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave。

save:在主线程中执行,会导致堵塞。
bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了堵塞主线程,这也是redis RDB默认的配置项。

二、快照时数据能修改吗?

在给别人拍照时,一旦对方动了,那么这张照片就拍糊了,我们就需要重拍,所以我们当然希望对方保持不动。对于内存快照而言,我们也不希望数据“动”。

为了快照而暂停写操作,肯定是不能接受的。所以这个时候,Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。

bgsave 是由主线程 fork 创建的,可以共享主线程的所有内存数据。

此时,如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

Redis 持久化 RDB(Redis database)

这既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响。

三、可以每秒做一次快照吗?

风险
1、在进行bgsave的时候,虽然,bgsave 进行执行不堵塞主线程,但是在主线程会fork子进程,这个时候会堵塞。
2、在

增量快照:
增量快照就是指在做了一次全量快照后,后续的快照记录只对修改的数据进行快照记录,这样可以避免每次全量快照的开销。

在第一次做完全量快照后,T1 和 T2 时刻如果再做快照,我们只需要将被修改的数据写入快照文件就行。但是,这么做的前提是,我们需要记住哪些数据被修改了。你可不要小瞧这个“记住”功能,它需要我们使用额外的元数据信息去记录哪些数据被修改了,这会带来额外的空间开销问题。这对于内存资源宝贵的 Redis 来说,有些得不偿失。

Redis 持久化 RDB(Redis database)

到这里,你可以发现,虽然跟 AOF 相比,快照的恢复速度快,但是,快照的频率不好把握,如果频率太低,两次快照间一旦宕机,就可能有比较多的数据丢失。如果频率太高,又会产生额外开销,那么,还有什么方法既能利用 RDB 的快速恢复,又能以较小的开销做到尽量少丢数据呢?

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

配置项: aof-use-rdb-preamble yes

这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。

总结:

1、数据不能丢失时,内存快照和rdb 混合使用是一个好的办法。
2、允许分钟级别的丢失,可以使用rdb。
3、如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Redis持久化RDB和AOF实现原理
Redis持久化RDB和AOF为什么Redis需要持久化?因为Redis属于内存型数据库,数据是储存在内存当中的,当遇到不可抗力因素,比如断电,那么储存在内存中的数据就会丢失。所以为了保证数据的完整性,我们需要做持久化操作,来保证数据的完整性。Redis中都有哪些持久化机制?Redis早
Stella981 Stella981
3年前
NoSQL数据库Redis和MongoDB
redis简介一些特点:Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis支持多种数据类型,包括:string、hash、list、set,zset、bitm
可莉 可莉
3年前
051. Redis 持久化机制
1\.持久化介绍Redis的数据存在在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。!image20200511165351687(https://oscimg.oschina.net/os
Stella981 Stella981
3年前
Redis 的落地策略
因为之前使用redis一般都只做热数据处理,没有考虑过落地方案,因此,通过很多次不同的交流,发现落地也挺重要的,特来学习一般。落地策略我们知道,redis是纯内存数据库,一旦发生宕机,数据就会丢失,因此,Redis的落地策略其实就是持久化(Persistence),主要有以下2种策略:1.RDB:定时快照方式(snapsho
Stella981 Stella981
3年前
051. Redis 持久化机制
1\.持久化介绍Redis的数据存在在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。!image20200511165351687(https://oscimg.oschina.net/os
Stella981 Stella981
3年前
Redis——持久化数据
Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式和AOF方式。一、RDB方式RDB方式的持久化是通过快照(snapshotting)完成的,
Stella981 Stella981
3年前
Redis—持久化
一、持久化简介Redis的数据全部存储在内存中,如果突然宕机,数据就会全部丢失,因此必须有一套机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制,它会将内存中的数据库状态保存到磁盘中。持久化发生了什么|从内存到磁盘
Stella981 Stella981
3年前
Redis持久化问题定位与优化技巧
今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。Redis持久化方式RDB(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%
Stella981 Stella981
3年前
Redis 持久化(10)
持久化机制Redis速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。RDBRDB是Redis默认的持久化方案。当满足一定条
Stella981 Stella981
3年前
Redis持久化存储详解(一)
为什么要做持久化存储?持久化存储是将Redis存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道Redis是一个基于内存的nosql数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失。持久化存储分类在Redis中,持久化存储分为两种。一种是aof日志追加的方式
子非鱼 子非鱼
3年前
Redis高级
第一章Redis的持久化由于redis是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以redis的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。1、RDB持久化方案Redis会定期保存数据快照至一个rbd文件中,并在启动时自动