redis持久化快速回忆手册

摘要:
Redis提供的持久性机制:1)RDB持久性:该机制指的是在指定的时间间隔内将内存中的数据集快照写入磁盘。3). 无持久性:我们可以通过配置禁用Redis服务器的持久性功能。收到这个命令后,Redis会将内存中的数据保存到一个类似于快照的命令中的临时文件中,最后替换原始的持久日志文件。

Redis提供的持久化机制:

  1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 

  2). AOF持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

  3). 无持久化:我们可以通过配置的方式禁用Redis服务器的持久化功能。

  4). 同时应用AOF和RDB。

快照(RDB)默认持久化方式

  将内存中数据以快照的方式写入二进制文件中,默认文件名为dump.rdb。可以通过配置设置redis服务器自动做快照持久化的方式。我们可以配置redis在n秒内如果超过了m个修改就自动做快照。
snapshotting默认设置:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
save 60 10000
  对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,子进程将快照数据写入到临时RDB文件中,当子进程完成数据写入操作后,再用临时文件替换老的文件,这样就可以极大的避免服务进程执行IO操作了。每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。所以如果数据量大的话,写操作会比较多,必然会引起大量的磁盘IO操作,可能会严重影响性能。
  注意:快照方式是在一定间隔时间做一次,如果redis意外宕机,就会丢失最后一次快照后的所有数据的修改。
  对于灾难恢复而言,我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。
  由于RDB是通过fork子进程来协助完成数据持久化工作的,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

日志追加方式(append-only file:aof)方式

  redis会将每一个收到的命令都通过write函数追加到命令中,当redis重新启动时会重新执行文件中保存的写命令来在内存中重建这个数据库的内容,这个文件在bin目录下:appendonly.aof。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上,这样的持久化还是有可能丢失部分修改。但是可以通过配置文件告诉redis通过fsync函数强制操作系统写入到磁盘的时机
aof设置:
appendonly yes //启动aof持久化方式有三种修改方式
#appendfsync always //收到写命令就立即写入到硬盘,效率最慢,但是保证完全持久化
#appendfsync everysec //每秒种就写入一次硬盘,在性能和持久化方面做了折中
#appendfsync no //完全依赖操作系统,性能最好,但是持久化没保证,不知道何时持久化
  事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。
  由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-
  如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
  对于相同数量的数据集而言,AOF文件通常要大于RDB文件。日志追加的方式导致持久化文件会变得越来越大。例如调用incr intsmaze命令100次,文件中就保存了100条命令,其实有99条都是多余的。因为要恢复数据库状态其实文件中保存一条set intsmaze 100就可以了。为了压缩这种持久化方式的日志文件,redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的持久化日志文件。
  实际中使用always方式,开启了always方式,redis的并发量就会下去。实际生产中都不会用快照的方式。

Redis的数据备份:

    在Redis中我们可以通过copy的方式在线备份正在运行的Redis数据文件。这是因为RDB文件一旦被生成之后就不会再被修改。Redis每次都是将最新的数据dump到一个临时文件中,之后在利用rename函数原子性的将临时文件改名为原有的数据文件名。因此我们可以说,在任意时刻copy数据文件都是安全的和一致的。鉴于此,我们就可以通过创建cron job的方式定时备份Redis的数据文件,并将备份文件copy到安全的磁盘介质中。

免责声明:文章转载自《redis持久化快速回忆手册》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C语言之大整数加法LIMIT语句解析及本章简单回顾(二十九)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python与redis交互

前言 首先我使用电脑为:Macbook air,电脑操作系统版本为10.13.6,处理器1.8GHz Intel Core i5, 安装python 版本号:python3.6.5 ,ide: pycharm 前置,已经安装homebrew,安装homebrew流程参考 https://blog.csdn.net/ziyuzhiye/article/det...

LINUX系统配置

LINUX系统配置 Linux 安装jdk方法; Linux Tomcat 安装与配置 Linux redis 安装与配置 (例1) Linux redis安装配置(例2) NGINX 安装 Linux 安装jdk方法 JDK安装 tar.gz为解压后就可使用的版本,这里我们将jdk-7u3-linux-i586.tar.g...

Redis实现之数据库(一)

服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构体的db数组中,db数组的每个项都是一个redis.h/redisDb结构体,每个redisDb结构体代表一个数据库 redis.h struct redisServer { …… //一个数组,保存着服务器中所有数据库 redisD...

Spring 实现数据隔离

需求 用户数据要同时支持在mysql和redis进行管理、存储。 思路 利用spring的注解,在配置中指定存储类型,启动时识别并选择对应的实现类。 代码 1. 用户管理的接口类 public interfaceIUserManager { booleancreateUser(User user); booleanremoveUser(); ....

【5】Redis从入门到放弃---秒杀案例(Redis的事务+锁机制+lua脚本)

(1)Redis的事务 1.1 Redis事务的定义: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 1.2 Multi、Exec、discard命令 组队阶段:从输入multi命令开始,后面输入的任务命...

Windows下Redis的安装和部署

Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,z...