Redis持久化

比特拓霓鹤
• 阅读 891

Redis有两种持久化方案,RDB(Redis DataBase)和AOF(Append Only File)

一、RDB

redis的RDB方案是一种快照方式持久化,就是在某时刻把所有数据进行完整备份。RDB是redis默认的持久化方案,它的作用是一旦在指定的时间间隔内,执行指定次数的写操作,redis服务会将内存中的数据写入磁盘中,默认是写入/var/lib/redis/dump.rdb 文件,redis重启会通过加载dump.rdb文件恢复数据

1.从配置文件了解RDB

打开 /etc/redis.conf 文件,找到SNAPSHOTTING部分内容

1.  ################################ SNAPSHOTTING  ################################ 
2.  #   save <seconds> <changes> 
3.  # 下面第一行的意思是如果900内至少有一个键被改动,自动进行数据保存,若不想使用RDB持久化可以把所有 
4.  #save配置注释掉,或者添加一行 save "" 
5.  save 900 1 
6.  save 300 10 
7.  save 60 10000 

9.  # 若redis最近一次持久化到dump文件出错,则默认不允许进行写操作,改成no则无视持久化错误允许写操作 
10.  stop-writes-on-bgsave-error yes 

12.  # 压缩dump持久化文件,改成no不压缩文件会变大很多,不过能节一点cpu,建议使用默认值yes 
13.  rdbcompression yes 

15.  #持久化文件校验,会消耗一些性能,建议使用默认值yes 
16.  rdbchecksum yes 

18.  # RDB持久化文件名 
19.  dbfilename dump.rdb 

21.  # 持久化文件存储目录,即dump文件所在目录,aof文件也会放在这个目录下 
22.  dir /var/lib/redis 

2.触发RDB快照的几种方式

save         此命令是同步命令,在持久化时会阻塞所有客户端请求
bgsave     异步命令,会生成一个子进程将内存数据保存到dump文件,不影响主进程服务。通过配置文件save属性触发的持久化也是通过bgsave方式保存,新建进程会消耗内存
flushall     此命令在清空redis数据后会进行持久化操作
shutdown  使用shutdown命令会先进行持久化操作再关闭服务

3.优缺点

优点:
  紧凑的单一文件,适用于灾难恢复
  与aof相比,在恢复大的数据集时,RDB方式会更快
缺点:
  RDB需要经常生成子进程来进行数据持久化,耗时、耗性能
  数据完整性不高,根据配置,一旦发生redis意外宕机可能会丢失几分钟的数据

二、aof

redis的aof备份是一种写日志方式持久化,就是将用户所有的写指令备份到文件中,还原数据时会将所有指令重新执行一遍。redis默认不开启aof,redis中RDB和aof两种持久化方式能同时使用

1.aof重写

因为aof的运作方式是不断将命令追加至文件的末尾,随着写入命令的不断增加,aof文件体积会变得越来越大。比如,对一个计数器调用了100此incr,那仅仅为了保存一个值aof文件就需要使用100条记录。这样不止会造成aof文件体积过大,还会导致数据恢复时速度太慢。而实际上只用一条set命令就足以保存计数器当前值了。
为了处理这种情况redis支持bgrewriteaof重写命令,用于异步执行aof文件重写操作,上面的100条记录变成1条。它会创建一个当前aof文件的优化版本,而即使bgrewriteaof执行失败,也不会有任何数据丢失,因为旧的aof文件在bgrewriteaof成功之前不会被修改。redis在一定条件下会自发进行重写,也可以调用bgrewirteaof命令主动重写

2.从配置文件了解aof

打开/etc/redis.conf 文件,找到 APPEND ONLY FILE 部分

1.  # 为了解决RDB一致性问题而生,默认不开启 
2.  appendonly no 

4.  #保存文件名 
5.  appendfilename "appendonly.aof" 

7.  # aof实际上是调用fsync()让系统将内存中数据保存到磁盘上,有些系统会立即保存,有些系统只能做到“尽可能快”保存 
8.  #redis支持三种模式来调用fsync(): 
9.  #no: 不调用,系统按自己步调保存内存数据到磁盘 
10.  #always:每一次写操作都调用 
11.  #everysec: 每秒调用一次 
12.  # appendfsync always 
13.  appendfsync everysec 
14.  # appendfsync no 

16.  # aof的fsync虽然是一个单独线程,但是它还是会阻塞redis的同步写操作,而RDB的bgsave和aof的bgrewriteaof(重写,从后面了解) 
17.  # 会占用大量的I/O,是fsync阻塞住,那就意味着阻塞同步写操作。下面属性意思是不在bgsave或bgrewriteaof时 
18.  # 调用async,如果填yes最坏情况有可能导致丢失30秒的日志。为了数据一致性默认填no 

20.  no-appendfsync-on-rewrite no 

22.  #下面两个用于配置自动重写的触发条件。只有两个条件都满足才触发 
23.  #第一个当前aof文件比上一次重写后aof文件增加的百分比,如果是0则aof不会自动重写,如果没有上一次 
24.  #重写则按redis服务启动时aof文件大小算 
25.  #第二个表示aof文件至少要达到这个大小才重写,主要为了防止aof文件很小的时候经常触发重写 
26.  auto-aof-rewrite-percentage 100 
27.  auto-aof-rewrite-min-size 64mb 

29.  # 在一些时候会发生aof文件最后面记录出问题,比如服务奔溃aof一行记录写到一半 
30.  #下面这个属性yes表示在恢复数据时碰到最后一条问题记录会记录下来但是不影响前面数据恢复,no则直接恢复失败 
31.  aof-load-truncated yes 

3.优缺点

优点:
  redis更耐久,使用默认的每秒fsync策略,能保证最多丢失1秒的数据,而性能依旧很好
  有序的保存了对数据库的操作,易读。比如不小心执行flushall命令,找到aof文件,移除末尾的flushall命令,就能恢复数据

缺点
  相同数据集下,aof文件体积通常要大于RDB文件体积
  aof的数据恢复速度可能会低于RDB不过是可以接受的

点赞
收藏
评论区
推荐文章
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
Stella981 Stella981
3年前
Redis 持久化方式
针对Redis的话题估计有些读者已经开始反感了,昨天还是有一些读者困惑,这就具体讲述下Redis持久化方式RDB的实现方式~01 触发时机手动触发:save:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用bgsav
Stella981 Stella981
3年前
Redis 的落地策略
因为之前使用redis一般都只做热数据处理,没有考虑过落地方案,因此,通过很多次不同的交流,发现落地也挺重要的,特来学习一般。落地策略我们知道,redis是纯内存数据库,一旦发生宕机,数据就会丢失,因此,Redis的落地策略其实就是持久化(Persistence),主要有以下2种策略:1.RDB:定时快照方式(snapsho
Stella981 Stella981
3年前
Redis——持久化数据
Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式和AOF方式。一、RDB方式RDB方式的持久化是通过快照(snapshotting)完成的,
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日志追加的方式
Stella981 Stella981
3年前
Redis学习笔记(五)之持久化
RDB在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存中。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了。再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是
Stella981 Stella981
3年前
Redis持久化的几种方式——RDB深入解析
点击上方“Java中文社群”,选择“设为星标(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzUzMTA2NTU2Ng%3D%3D%26mid%3D2247486188%26idx%3D3%26sn%3Df160d91ea2
子非鱼 子非鱼
3年前
Redis高级
第一章Redis的持久化由于redis是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以redis的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。1、RDB持久化方案Redis会定期保存数据快照至一个rbd文件中,并在启动时自动