Redis专题(五)——Redis数据持久化

Redis专题(五)——Redis数据持久化

(原创内容,转载请注明来源,谢谢)

当服务器突然发生问题,或者redis重启,如果希望将数据持久化在硬盘中,下次开启redis还有数据时,redis提供了两种方案,一个叫做RDB(通过内存快照(Snapshotting)实现),另一个叫做AOF(日志追加(Append-only file))。通常结合两种方式来实现redis的持久化。

1、RDB

RDB通过内存快照实现,会将redis当前的全部数据以快照的方式写入二进制文件中。实现快照有以下几种方式:

1)用户配置规则,自动快照

采用save <seconds><changes>,每当seconds秒内改动超过changes次,则会触发快照。可以同时设置多个save,每个save是【或】的关系,即满足一个save就会实现快照。

例如:

         save100 10
         save200 20
         save300 30

表示100秒内改动超过10次,或200秒内改动超过20次,或300秒内改动超过30次,则redis自动快照。

2)手动执行save或bgsave,实现快照

save命令手动执行,会立即快照。但是由于redis的单线程特性,则会发生阻塞。且如果redis存储的内容多,保存速度较慢。因此不建议save方式实现快照。

bgsave实现在后台异步快照,不影响redis的正常使用。

3)flushall命令

flushall会清空redis的所有数据。当执行此命令之前设置过任意快照条件,只要有设置快照触发条件,flushall命令执行后无论是否满足快照条件,都很执行一次快照。

4)主从复制

当执行主从复制,即使没有设置快照条件,也会执行快照操作。

2、快照原理

redis默认将快照存储在redis当前进程工作目录中,文件名默认是dump.rdb,可以通过配置dir和dbfilename改变快照的路径和文件名。快照执行过程如下:

1)redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。fork函数采用写复制方式,当复制过程中如果有数据改动,会被同步改动到复制后的数据。因此复制的数据是执行fork时间的数据。

2)父进程继续处理客户端的命令,子进程将数据写入硬盘。

3)子进程写完所有文件后会将新的RDB替换旧的RDB文件,写入完成。

快照的优势如下:

1)fork可以使得副本复制后,占用的内存不是当前使用量的两倍,但是仍需要临时占用较多内存,因此设计的时候需要考虑好用到多少内存,避免快照失败。

2)快照生成的rdb文件是新的直接替换旧的,因此任意时刻的rdb文件都是完整的。这也就让用户可以定时备份rdb文件。

3)rdb文件是压缩后的文件,因此实际占用量小于原来在内存的使用量。

3、AOF

AOF开启后会降低redis异常关闭导致的数据丢失。AOF会将用户执行的每一条写命令追加到硬盘中,保证数据实时,此操作会降低性能。

1)开启AOF

默认情况下是没开AOF的,可以通过命令appendonlyyes来开启。开启后每个写入的命令都会被执行,默认文件名是appendonly.aof,路径和rdb相同。

2)AOF详情

AOF记录的是redis客户端给redis发送的通信协议原生的内容。

但是,仅记录命令有可能会浪费空间,如连续10个命令对一个键的值进行设置,其实只需要记录最后一次的操作就可以。redis可以通过配置文件对aof进行自动重新,包括aof大小超过一定空间,或者本次的文件内容达到上次重写后的百分之多少。

另外,可以手动通过命令BGREWRITEAOF,实现手动命令重写AOF。

AOF采用行的方法记录,每一行记录一个内容,要么是命令,要么是键,要么是值。因此恢复起来速度比rdb慢。

3)同步硬盘数据

由于操作系统也存在缓存,因此每次执行aof的写入,只是被写入硬盘的缓存中,每30秒会同步到硬盘。因此30秒内如果系统异常奔溃,这30秒的数据可能会丢失。

为了避免这个情况,redis允许配置appendfsync,包括always、no、everysec三种参数。默认是everysec,即每秒强制要操作系统完成一次同步;always每次写入的时候同步,最安全但最慢;no是用操作系统的方法进行同步,不安全。

通常会同时开启AOF和RDB两种持久化,保证数据的一致性。

——written by linhxx 2017.08.10

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据-Hadoop、Spark

wget unable to resolve host address>问题>解决方法

>问题 今天在CDH资源上 http://archive.cloudera.com/cdh5/cdh/5/ 下载 hive-1.1.0-cdh5.7.0 htt...

5047
来自专栏云计算教程系列

如何在Ubuntu 18.04上保护Redis的安装

Redis是一个使用内存技术,NoSQL,键值缓存及存储,也可以保存到磁盘。它专为受信任环境中的受信任客户端设计,自身没有强大安全功能。这里是Redis官方网站...

1215
来自专栏coder修行路

python爬虫从入门到放弃(二)之爬虫的原理

在上文中我们说了:爬虫就是请求网站并提取数据的自动化程序。其中请求,提取,自动化是爬虫的关键!下面我们分析爬虫的基本流程 爬虫的基本流程 发起请求 通过HTTP...

2089
来自专栏尾尾部落

Mac中的定时任务利器:launchctl

当然mac也可以像linux系统一样,使用crontab命令来添加定时任务,这里就不赘述,具体可参见:OS X 添加定时任务

1925
来自专栏程序员的碎碎念

redis.conf配置文件详解

daemonize no 是否以后台进程启动 databases 16 创建database的数量(默认选中的是database 0)

1382
来自专栏开源优测

基于jenkins和jmeter实现接口自动化过程

前面几篇文章中,我们已经了解了jenkins的安装与相关功能配置,那么,今天我们将介绍下如何结合jmeter实现接口自动化的过程。 一、准备工作 1、首先要准备...

3175
来自专栏菩提树下的杨过

redis 学习笔记(1)-编译、启动、停止

一、下载、编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载...

2005
来自专栏Pythonista

redis持久化RDB与AOF

Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据...

812
来自专栏一名合格java开发的自我修养

redis主从,哨兵回忆手册

  Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据(注意初次同步则会阻塞)。

831
来自专栏云计算教程系列

如何在Ubuntu 14.04上备份和还原Redis数据

Redis是一个键值缓存的数据库,它可以持久保存(永久保存)到磁盘存储(即数据库)中。在本文中,您将了解如何在Ubuntu 14.04服务器上备份Redis数据...

2465

扫码关注云+社区