首页 > 数据库 >redis的持久化

redis的持久化

时间:2022-11-24 09:23:04浏览次数:40  
标签:文件 持久 aof redis 默认 重写

redis是一种基于内存的非关系型数据库,内存虽然快但是数据也更易丢失,所以redis提供了两种持久化方式,分别是RDB和AOF,今天就介绍下这两种持久化方式以及原理

一、RDB

1、介绍

rdb是一种快照式的存储也是redis默认的持久化策略,它将内存中的数据持久化到磁盘中且能做到不影响redis的性能;其有两种持久化方式,一个是阻塞式的持久化(save)另一个是非阻塞式后台的持久化(bgSave);

2、实现原理

利用linux父子进程的概念,持久化时fork一个子进程,但并没有复制父进程内存中的所有数据,而只是移动了指针,利用了copy on write机制只在write时才真正的复制数据,速度快;父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能;

注意:需要明确linux父子进程之间是相互隔离的,开启save过后子进程只专注于文件的落盘操作,此时主进程仍然可以接收客户端请求,只是在有写操作时利用copyonwrite机制复制数据

3、优缺点

RDB恢复数据的时间快,bgsave的时候也不会影响redis对外提供的性能,但是会存在较大丢失数据的风险;并且不支持拉链存储,即最新的rdb文件会覆盖掉历史版本的文件,硬盘永远只有一份持久化文件

4、相关配置

  • save time count 在time时间内修改操作发生count笔时触发rdb
  • stop-writes-on-bgsave-error 在持久化时如果出错是否停止对外的写入操作,默认为yes;即当持久化出问题比如说磁盘满了的时候外界写入会报错
  • rdbcompression 默认为yes,表示将存到磁盘中的快照通过LZF算法进行压缩处理
  • rdbchecksum 是否使用CRC64算法校验rdb文件是否损坏,默认为yes;如果需要提升redis的性能,此处可以不校验
  • dbfilename rdb持久化文件的名称,默认为dump.rdb
  • dir rdb持久化文件存放的目录,默认为当前目录./

二、AOF

1、介绍

一种通过配置可以做到几乎实时的写入式持久化方式,相对应的其会影响系统的性能;

2、实现原理

将每个redis指令都写入aof文件,并且具有重写能力:随着同步操作越来越多aof文件的大小也会越来越大,这时会触发重写机制;redis可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。需要注意的是redis4.0以后重写是会把rdb文件写到aof文件里面,只追加rdb过后的命令;这样大大提高了效率

3、同步间隔配置

可以配置 Redis 多久才将数据 fsync 到磁盘一次;redis提供了三种方式:

  • 1、从不;将数据交给操作系统来处理,不主动刷盘,是个更快,也更不安全的选择。
  • 2、每秒(默认);每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
  • 3、总是;每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全

4、优缺点

AOF更安全,更不易丢数据,但是AOF恢复数据没有RDB快,且AOF理论上会存在文件一直无限变大的可能,即使有重写和合并RDB机制,但当redis运行的时间足够长时还是会存在文件过大的问题

5、相关配置

  • appendonly 是否开启aof持久化,默认为no
  • appendfilename aof的文件名称
  • appendfsync 同步间隔,即多久写入一次,三个候选值:always、everysec和no,默认使用的是everysec
  • no-appendfsync-on-rewrite 在重写时是否使用no这种刷盘机制,默认为no,不使用

分析:在redis重新时主进程必然也会存在有大量写入操作的可能,两者都会操作磁盘,影响性能;该配置意思是在是否使用no这种刷盘机制,上面也结束了,no这种机制是最快但是最不可靠的写入方式;redis默认为no,即表示在重新时仍然不使用no这种方式,宁愿阻塞等待也不愿意丢失数据;为yes的话则表示重写时主进程使用no这种刷盘机智;

  • auto-aof-rewrite-percentage 重写百分比即下次重写的触发时机,默认为100,表示当前aof文件的增长大小达到上次重写后aof文件大小的100%时则自动触发重写;如果设置为0则表示不触发重写操作
  • auto-aof-rewrite-min-size 指定触发重写操作时aof文件的大小,默认为64M,即aof文件达到64m才会触发重写,不到64M即使满足auto-aof-rewrite-percentage也不会触发;
  • aof-load-truncated aof文件损坏redis是否仍然载入;默认为yes;

注意:如果aof文件在中间损坏,redis仍将退出并出现错误;

三、持久化的选择策略

  • 如果允许部分数据丢失,可以选择RDB
  • 如果需要尽量避免数据丢失,可以使用RDB+AOF的混合方式
  • 如果需要在性能和丢失做一个中和,可以使用AOF的每秒刷盘一次的策略

标签:文件,持久,aof,redis,默认,重写
From: https://www.cnblogs.com/darling2047/p/16914839.html

相关文章

  • Redis知识
     Redis是什么Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 Redis&Memcached......
  • redis 缓存设计之穿透击穿雪崩
    缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常处于容错的考虑,如果从存储层查不到数据则不写入缓冲层缓存穿透将导致不存在的数据每次请求......
  • redis通过lua脚本------实现原子性操作(PHP代码实现)
    背景一直都知道redis里可以执行lua脚本,但是以前一直搞不懂redis为啥要这么搞,今天看了人家一篇博文,说秒杀场景出现商品超卖,解决方案是利用lua脚本来保证操作的原子性自己......
  • Redis后端面试题
    目录简要说一下什么是Redis?为什么要⽤Redis(缓存)?为什么要⽤Redis⽽不⽤map/guava做缓存?Redis与Memcached的区别Redis的应⽤场景redis为什么那么快redis有哪些数......
  • redis启动客户端
    启动Redis启动方式:①前台启动redis-server②后台启动redis-server&最好使用后台启动,不占用命令终端.③根据配置文件启动启动命令配置文件&启动redis服务时,指......
  • 【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
    问题描述在AzureRedis服务中,如何实现只允许AzureAppService访问呢? 问题解答AzureRedis开启防火墙的功能,并在防火墙中添加上AppService的出口IP地址即可。两步......
  • Redis 菜鸟进阶
    Redis菜鸟进阶背景最近产品一直要优化性能,加强高可用.有一个课题是Redis高可用与性能调优.我这边其实获取到的内容很有限.最近济南疫情严重,自己锁骨骨折.然后通......
  • redis的安装及使用
    安装redis操作步骤#解压tar-zxvfredis-5.0.14/.tat.gz-C/urs/local/#重命名,易读mv/urs/local/redis-5.0.14//urs/local/redis/#安装环境依赖包yumin......
  • 10. Redis常见问题
    https://www.bilibili.com/video/BV1PA4y1D7Ry?p=271Redis到底是单线程还是多线程   2Redis单线程为什么还能这么快  哈希表:一维数组和链表3Redis底层数......
  • 5. Redis常见命令
    1Redis数据结构介绍Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样。基本类型String:helloworldHash:{name:"Jac......