reids持久化机制(RDB与AOF)

Redis提供了RDB和AOF两种持久化方式。RDB通过快照在指定时间间隔保存数据,适合数据备份和灾难恢复,但可能导致数据丢失。AOF记录每次写操作,确保高数据安全性,支持每秒同步,但文件体积可能增大。AOF重写可压缩文件并保证数据一致性。在选择时,根据对数据丢失容忍度和性能需求来决定。
摘要由CSDN通过智能技术生成

Redis 提供了不同级别的持久化方式:

  • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
  • AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
  • 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
  • 你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
  • 最重要的事情是了解RDB和AOF持久化方式的不同,让我们以RDB持久化方式开始:

1、RDB机制

  1. 触发机制有三种:save、bgsave、自动化
    在这里插入图片描述
  • save触发方式:
    该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止,Redis会返回OK(一般不会使用)
  • bgsave触发方式:
    执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求;
    具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
  • 自动触发:
    自动触发是由我们的配置文件来完成的(最终执行的是bgsave)。在redis.conf配置文件中,里面有如下配置,我们可以去设置:
# 这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘,比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
# 表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 900 1
# 表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 300 10
# 表示60 秒内如果至少有 10000 个 key 的值变化,则保存
save 60 10000
# 默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。
stop-writes-on-bgsave-error yes
# 默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。
rdbcompression yes
# 默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum yes
#  设置快照的文件名,默认是 dump.rdb
dbfilename dump.rdb
# 设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。
dir /usr/local/redis/data
  1. RDB的优点
  • RDB是一个非常紧凑的文件,它保存了某个时间点的数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.
  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复.
  • RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
  • 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.
  1. RDB的缺点
  • 如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据.
  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度.

2、AOF机制

  1. AOF机制的介绍及相关配置
  • 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
    只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis
    重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
  • AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
# 默认不开启(appendonly no)
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 执行频率always(每一次写操作都执行)、evrysec(每秒执行一次)、no(不执行);一般使用evrysec
appendfsync evrysec
# aof重写操作会对磁盘造成大量的I/O操作,若在这期间主进程仍然写aof文件,主进程可能会因此发生阻塞(设置为no的情况),但是不会丢失数据。
# 如果设置为yes,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),
# 但是如果这个时候redis挂掉,就会丢失数据。在linux的操作系统的默认设置下,最多会丢失30s的数据。
no-appendfsyc-on-rewrite no
# 代表当前AOF文件空间和上一次重写后AOF文件空间的比值,下面的100表示超过上次aof文件的100%则触发重写
auto-aof-rewrite-percentage 100
# 表示运行AOF重写时文件最小体积,默认 为64MB。当前aof文件大于这个值,则重写
auto-aof-rewrite-min-size 64mb
# 当设置成yes时,redis会忽略最后一条可能存在问题的操作日志,并发出一个日志来通知用户;
# 当设置成no时,aof文件有问题,直接报错,用户需要手动redis-check-aof来对aof文件修复。
aof-load-truncated yes
# 设置为yes,开启混合持久化模式,重写aof时,会使用rdb持久化模式将共享的内存副本全量的以RDB方式写入aof文件
# 然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,
# 并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件。最终的aof文件形式:[RDB file][AOF tail]
aof-use-rdb-preamble yes
  1. AOF 优点
  • AOF的每秒fsync策略可以保证Redis就算宕机,最大也只丢失1秒的数据。
  • Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写。
  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。
  1. AOF 缺点
  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入操作时,RDB 可以提供更有保证的最大延迟时间(latency)。
  • 曾经恢复数据出现过bug

3、如何选择使用哪种持久化方式?

一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。

如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。

有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。

借鉴于:http://www.redis.cn/topics/persistence.html
这个官方文档(中文版),讲得很是详细,建议全文阅读。本文只借鉴文档部分内容,加了在实际生产中的配置讲解。

MySQL 教程MySQL 是流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成databaseRDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。MySQL数据库MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 是开源的,目前隶属于 Oracle 旗下产品。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。MySQL 对PHP有很好的支持,PHP 是目前流行的 Web 开发语言。MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。Redis 教程REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值