redis持久化

redis的数据存在内存中,所以存取性能好。但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失。为了解决这个问题,redis支持持久化。持久化就是为了解决内存数据丢失时恢复数据的,而不是为了将暂时不用的数据转移到硬盘。

redis存储数据达到内存上限时,再也存不进去数据的,会报错。实际生产环境中,我们最好保证数据最大量不超过内存的上限的一半。这个理由后面会讲到。

缓存穿透:某个不存在的值被频繁请求,缓存不存在,请求数据库,数据库中也不存在,每次都去请求数据库。

缓存雪崩:所有的缓存都失效了。

持久化可以理解为就是把内存数据副本存在硬盘中,这样内存数据丢失时可以从硬盘中恢复。

redis支持两种方式的持久化,RDB(内存快照)和AOF(日志追加)。RDB也可理解为半持久化,也是redis默认的持久化方式。AOF的持久化更好,但是对性能有影响。实际生产中是两种方式并用。

VM虚拟内存已经不再推荐,严重影响性能

1 :RDB 内存快照

RDB称为内存快照,将内存中的数据快照按照我们设定的配置周期性的写入硬盘。

原理:

1. redis调用fork,现在有了子进程和父进程。
2. 父进程继续处理client请求,(不阻塞)子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。(如果在整个子进程将数据写入硬盘过程中,无任何写请求,那么父子进程共享 内存数据。一旦有写操作,会copy一份副本。如果copy了一份副本,那么将占用双倍的内存,这就是为什么生产环境中力求数据量不超过内存一半的原因)

3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出(fork一个进程入内在也被复制了,即内存会是原来的两倍)。

save和bgsave命令也会触发RDB,进行持久化。save命令启用主进程进行持久化,期间会阻塞客户端请求,用得少。bgsave命令会启用子进程进行持久化,和上面的原理一样。

RDB持久化会丢失上次备份到奔溃这段时间内的数据,用来做冷备份还是不错的。如果想获得更好的持久性,AOF更合适。但是AOF得性能要差一些

2 :AOF 日志追加  默认不开启

AOF会把redis服务器的每一次写操作写入appendonly.aof文件中,这个文件存在硬盘中。如果内存失效,redis服务器会从这个文件中读取命令,进行恢复。操作系统本身的缓存机制使得appendonly.aof的追加不会立即写入硬盘,重启时也会丢失部分修改写操作。通过redis配置可以强制将缓存立即写入硬盘。

aof方式会使得.aof文件越来越大。通过配置,可以定期的对.aof文件进行重写。命令bgrewriteaof,可以对aof文件进行重写。

下面是重写.aof文件的原理,而不是日志追加的原理。日志追加就是往.aof文件末尾追加。

1.  redis调用fork ,现在有父子两个进程
       2. 子进程根据fork时刻内存中的数据库快照,往临时文件中写入重建数据库状态的命令(也遵守写时复制)
       3. 父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
       4. 当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
       5. 现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

一般对redis做主从同步,主机不开启任何持久化策略,保证最好的性能。而在从机上进行持久化,持久化采用两种策略结合的方式

redis持久化机制的更多相关文章

  1. 浅谈:Redis持久化机制(一)RDB篇

    浅谈:Redis持久化机制(一)RDB篇 ​ 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存 ...

  2. 浅谈:Redis持久化机制(二)AOF篇

    浅谈:Redis持久化机制(二)AOF篇 ​ 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...

  3. 北京大公司二面:了解Redis持久化机制吗?

    今日总结 Redis持久化机制:RDB和AOF RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制) AOF持久化:根据配置将写命令存储至日志文件中,顺序写&& ...

  4. Redis 持久化机制

    1.背景 之前在使用redis 时候,没有过多的考虑持久化! 但是这样即使你用了redis 也是徒劳,表面上你是用上了redis 进行缓存数据,感觉已经给自己的架构添加了一个道QPS 防护墙! 哈哈, ...

  5. 细说Redis持久化机制

    概述 Redis不仅能够作为缓存来使用,也能够作为内存数据库. Redis作为内存数据库使用时.必需要解决一个问题:数据的持久性.有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上 ...

  6. redis持久化机制【十三】

    一.Redis提供了哪些持久化机制: redis的高性能是因为其所有数据都存在了内存中 ,为了使redis在重启之后数据仍然不丢失,需要将数据同步到硬盘中,这一过程就是持久化. redis支持两种方式 ...

  7. Redis持久化机制,优缺点,如何选择合适方式

    一.什么是Redis持久化? 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失. 二.Redis 的持久化机制是什么?各自的优缺点? Redis 提供两种持久化机制 RDB(默认) 和 ...

  8. Redis持久化机制 RDB和AOF的区别

    一.简单介绍 Redis中的持久化机制是一种当数据库发生宕机.断电.软件崩溃等,数据库中的数据无法再使用或者被破坏的情况下,如何恢复数据的方法. Redis中共有两种持久化机制 RDB(Redis D ...

  9. 源码级别理解 Redis 持久化机制

    文章首发于公众号"蘑菇睡不着",欢迎来访~ 前言 大家都知道 Redis 是一个内存数据库,数据都存储在内存中,这也是 Redis 非常快的原因之一.虽然速度提上来了,但是如果数据 ...

随机推荐

  1. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

  2. javascript_basic_01之概述

    1.javascript组成: ①核心ECMAScript:②文档对象模型DOM(Document Object Model):③浏览器对象模型BOM(Browser Object Model): 2 ...

  3. Java 线程 — ConcurrentLinkedQueue

    ConcurrentLinkedQueue 在考虑并发的时候可以先考虑单线程的情况,然后再将并发的情况考虑进来. 比如ConcurrentLinkedQueue: 先考虑单线的offer 再考虑多线程 ...

  4. Java 线程 — AbstractQueuedSynchronizer

    锁 锁就是一种状态,比如互斥锁:同一时间只能有一个线程拥有,可以使用一个整型值来标志当前的状态 0:表示没有现成占有锁 1:表示锁已经被占用 AbstractQueuedSynchronizer 实现 ...

  5. HTML5语义标签的实践

    <article> 定义一篇文章 论坛发帖 博客文章 一篇文章 <article>  <h1>标题</h1>  <p>内容</p> ...

  6. 深入理解CSS背景

    前面的话 背景和字体一样,是一个复合属性,而且它是一个使用频率很高的属性.在CSS3中,背景属性在保持以前用法的同时,增加了新的相关属性.本文将详细介绍关于背景的知识 背景颜色 背景色backgrou ...

  7. [转载]TFS体系结构和概念

    TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台,简单的说它是管理和开发软件项目的整个生命周期的 ...

  8. kqueue用法简介

    1.什么是kqueue和IO复用 kueue是在UNIX上比较高效的IO复用技术. 所谓的IO复用,就是同时等待多个文件描述符就绪,以系统调用的形式提供.如果所有文件描述符都没有就绪的话,该系统调用阻 ...

  9. 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解

    一.首先是下载Java JDK 到目前为止的最新版本为(jdk1.8.0_60),有两种方式进行下载: 1.使用shell来进行下载,可使用如下命令直接进行下载: wget --no-check-ce ...

  10. Django--models一对多

    一对多--foreignkey 应用场景 当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择) 例如:创建用户信息时候,需要选择一个用户类型[普通用户][金牌用户][铂金用户]等. 创建表 ...