redis持久化机制
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持久化机制的更多相关文章
- 浅谈:Redis持久化机制(一)RDB篇
浅谈:Redis持久化机制(一)RDB篇 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存 ...
- 浅谈:Redis持久化机制(二)AOF篇
浅谈:Redis持久化机制(二)AOF篇 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...
- 北京大公司二面:了解Redis持久化机制吗?
今日总结 Redis持久化机制:RDB和AOF RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制) AOF持久化:根据配置将写命令存储至日志文件中,顺序写&& ...
- Redis 持久化机制
1.背景 之前在使用redis 时候,没有过多的考虑持久化! 但是这样即使你用了redis 也是徒劳,表面上你是用上了redis 进行缓存数据,感觉已经给自己的架构添加了一个道QPS 防护墙! 哈哈, ...
- 细说Redis持久化机制
概述 Redis不仅能够作为缓存来使用,也能够作为内存数据库. Redis作为内存数据库使用时.必需要解决一个问题:数据的持久性.有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上 ...
- redis持久化机制【十三】
一.Redis提供了哪些持久化机制: redis的高性能是因为其所有数据都存在了内存中 ,为了使redis在重启之后数据仍然不丢失,需要将数据同步到硬盘中,这一过程就是持久化. redis支持两种方式 ...
- Redis持久化机制,优缺点,如何选择合适方式
一.什么是Redis持久化? 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失. 二.Redis 的持久化机制是什么?各自的优缺点? Redis 提供两种持久化机制 RDB(默认) 和 ...
- Redis持久化机制 RDB和AOF的区别
一.简单介绍 Redis中的持久化机制是一种当数据库发生宕机.断电.软件崩溃等,数据库中的数据无法再使用或者被破坏的情况下,如何恢复数据的方法. Redis中共有两种持久化机制 RDB(Redis D ...
- 源码级别理解 Redis 持久化机制
文章首发于公众号"蘑菇睡不着",欢迎来访~ 前言 大家都知道 Redis 是一个内存数据库,数据都存储在内存中,这也是 Redis 非常快的原因之一.虽然速度提上来了,但是如果数据 ...
随机推荐
- salesforce 零基础学习(三十七) DML及Database方法简单描述
在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...
- 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)
通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的 ...
- springboot hessian
注意把hessian的依赖换成4.0.38或者把git文件里的4.0.37放到maven私服中去,推荐使用4.0.37版本.38版本存在序列化bigdecimal的问题. <dependency ...
- hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解
序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...
- 编译原理LL1文法分析树(绘图过程)算法实现
import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; impo ...
- Yii2的深入学习--继承关系
想要了解 Yii2 的话,一定要对 Yii2 中相关类的继承关系有所了解.由于暂时读的代码有限,下面的图中只列出了部分继承关系,之后回跟着源码阅读的越来越多而增加 由上图可以看到 Yii2 中大多数类 ...
- 机器学习&数据挖掘笔记_14(GMM-HMM语音识别简单理解)
为了对GMM-HMM在语音识别上的应用有个宏观认识,花了些时间读了下HTK(用htk完成简单的孤立词识别)的部分源码,对该算法总算有了点大概认识,达到了预期我想要的.不得不说,网络上关于语音识别的通俗 ...
- MAC Objective-C 开发经典书籍推荐
MAC Objective-C 开发经典书籍推荐 闻道有先后,术业有专攻,这句话放到计算机科学领域的理解可能每个人都会不同. 有些人选择一个操作系统,一个体系的编程语言,作一个领域的开发. 有些人选择 ...
- Android抓包方法(二)之Tcpdump命令+Wireshark
Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...
- redis学习之二from github
大概敲了一遍基本命令,熟悉了redis的存储方式.现在开始进一步系统的学习.学习教程目前计划有三个,一个是github上的https://github.com/JasonLai256/the-litt ...