其实redis就是一种高级的以键值对形式存储数据的数据库,而它的好处就是他可以支持数据的持久化,其实redis之所以会有这样的优点,主要是因为,redis的数据都是存放在内存中的,如果不配置持久化,那么在redis进行重启的时候,就会造成数据的丢失,于是redis开启了数据的持久化功能,将所有的数据保存到磁盘中,当redis重启之后,就可以直接从磁盘中恢复数据,所以redis的持久化功能,主要就是为了防止服务器宕机而造成的数据丢失。

redis也提供了两种不同的持久化方式:

第一种是:RDB持久化,RDB是Redis DataBase的缩写,redis默认的持久化方式,简单来讲就是将redis在内存中的数据库记录按照指定的时间转存到磁盘当中,其实就是一定时间间隔内对你的数据进行一个快照存储,在默认的情况下,redis在完成快照存储后就会将这些数据保存在一个dump.rdb的文件中,当redis运行的时候,RDB就会将内存中的数据集存储到磁盘当中,在redis进行重启的时候,就可以通过载入RDB文件到RDB程序进行数据的同步恢复。

优点:因为服务区在执行保存dump.rdb文件时,首先需要redis去调用forks()时,就会同时拥有父进程和子进程,而子进程其实就是将这些数据写入到一个临时的RDB文件当中,当子进程完成写入后,redis就会用一个新的RDB文件替换掉旧的RDB文件,并且将旧的RDB文件删除,所以因为这样的工作方式,RDB持久化方式就只有一个dump.rdb文件,非常方便持久化,而且由子进程完成写的操作,让主进程可以继续处理命令,这样可以使得IO最大化,使用单独的子进程来进行持久化,主进程就不会进行任何的IO操作,这样可以保证redis的高性能。

缺点:因为RDB是按照指定的时间每隔一段时间就要进行一次持久化,如果在持久化的过程中redis发生故障,那么依然会发生数据丢失,所以一般都在数据要求不太严谨的时候使用这种方式。

第二种:AOF持久化,AOF是Append Only File的缩写,默认AOF是不开启的,需要在redis.conf配置文件中手动开启,这种持久化方式就是将redis执行的每一次命令记录到单独的日志文件当中,当还原数据时,只需要将这些备份的指令再重新执行一遍即可。redis的配置文件中存在三种不同的AOF持久化方式,分别是:

appendfsync always:每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度

appendfsync everysec:每秒钟同步一次,将多个写命令同步到硬盘

appendfsync no:让操作系统决定何时进行同步

而且由于AOF持久化对日志文件的写入操作采用的是append模式,使用这种模式的好处就是,即使在写入的过程中出现宕机现象,也不会破坏日志文件中已经存在的内容,然而如果我们本次操作只写入了一半数据就出现了系统崩溃问题,也不用担心,在redis下一次启动之前,我们可以通过redis-check-aof工具来帮忙解决这种数据一致性的问题。

优点:数据安全,因为AOF有写回策略机制,比如:always,意思就是可以在每个执行命令执行完之后,立刻同步的将日志写回磁盘,而且AOF持久化快,能够减少数据丢失的量,在配置了everysec的情况下最多只会丢失秒级数据

缺点:在同等数据量的情况下,AOF文件的大小要比RDB文件大很多,如果使用它进行内存的恢复需要一定的时间。

针对以上阐述,在选择持久化方式上,一般来说,如果想要达到足以媲美关系型数据库的数据安全性,那么就应该同时使用两种持久化功能(redis4.0开始支持RDB和AOF混合持久化),在这种情况下,当redis重启的时候就会优先载入AOF文件来恢复原始数据,因为通常这种情况下,AOF文件保存数据集要比RDB文件保存数据集更加完整,如果你非常关心你的数据,但是仍然可以承受一些保持在分钟之内的数据丢失,那么你可以只选择使用RDB持久化,因为它可以更快,但是会有一些分钟之内的数据丢失是它的缺点。

有很多人都只使用AOF持久化,但其实不太推荐,因为定时生成RDB快照非常方便于进行数据库的备份,并且RDB恢复数据集的速度也要比AOF恢复的速度快,除此之外,使用RDB也可以有效规避AOF程序的bug,当然如果你只希望你的数据在服务器运行的时候存在,也可以不选择使用任何持久化方式。

以上就是针对该问题做的简要阐述,希望能够小小的帮助到大家。

如何理解redis两种不同的持久化方式的更多相关文章

  1. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  2. redis两种持久化方式的优缺点

    redis两种持久化的方式 RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,AOF文件中全部以 ...

  3. 两种获取connectionString的方式

    两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...

  4. Spring两种实现AOP的方式

    有两种实现AOP的方式:xml配置文件的方式和注解的形式 我们知道通知Advice是指对拦截到的方法做什么事,可以细分为 前置通知:方法执行之前执行的行为. 后置通知:方法执行之后执行的行为. 异常通 ...

  5. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  6. javascript两种声明函数的方式的一次深入解析

    声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME ...

  7. JIT(Just in time,即时编译,边运行边编译)、AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

    JIT(Just in time,即时编译,边运行边编译).AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

  8. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  9. Hibernate中两种获取Session的方式

    转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...

  10. FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法(firemonkey messaging)

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...

随机推荐

  1. nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?

    1 背景介绍 1.1 Nginx是什么? Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.其特点是占有内存少,并发能力强,事实上nginx的并发能力确 ...

  2. JDBC概念和基本用法

    概念:     JDBC (Java DataBase Connectivity):Java数据库连接,Java语言操作数据库.是官方(sun公司)定义的一套操作所有关系型数据库的规则, 即接口.各个 ...

  3. 关于*p++的执行顺序

    不确定*p++哪个优先级高了,想偷懒到百度找找解释,发现高赞的评论下也骂声一片,还是回头自己试试. 1 #include <iostream> 2 using namespace std; ...

  4. win10版本eclipse安装教程——

    第一步:下载jdk,配置环境 见我第二篇博客有说明:点击即可进入 第二步:下载eclipse 点击即可进入官网下载 点击 Download Packages,进入eclipse下载页面.从 Eclip ...

  5. 基于uniapp框架开发飞书小程序总结

    前期准备 飞书官方客户端文档:https://open.feishu.cn/document/home/intro 飞书官方工具资源文档:https://open.feishu.cn/document ...

  6. 获取指定字符串第n次出现的位置索引

    returnIndex(str,cha,num){ var x=str.indexOf(cha); for(var i=0;i<num;i++){ x=str.indexOf(cha,x+1); ...

  7. 【python_PAT_乙类】1013_数素数 ,Python运行超时解决方案

    题目: 令 P​i​​ 表示第 i 个素数.现任给两个正整数 M≤N≤10​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出格 ...

  8. Django框架搭建web项目(二)

    1.在路径XXXXX\mydjango\mydjango\mydjango下新建views.py(在浏览器中url请求后所展示的内容设置) from django.http import HttpRe ...

  9. OO课程第一阶段(前三次作业)总结Blog1

    OO课程第一阶段(前三次作业)总结Blog1 前言:学习OOP课程的第一阶段已经结束了,在此进行对于知识点,题量,难度的个人看法. (1)相比于另外两次作业,第一次作业基本上是基本的编程的语法训练,题 ...

  10. 源代码管理工具:Github

    GitHub是一个基于Git的进行版本控制的代码托管网站. Git指的是是一个开放源代码版本控制系统,由Linus Torvalds启动.在时间的累积下,现在的Github是一个最大的开源软件社区.在 ...