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 非常快的原因之一.虽然速度提上来了,但是如果数据 ...
随机推荐
- JS的prototype和__proto__ Constructor
一.prototype和__proto__的概念 prototype是 注意是 只有函数的一个属性才有的(每个函数都有一个prototype属性),这个属性是一个指针,指向一个普通对象并且不是原型对象 ...
- 自定义Image自动切换图像控件
做这么一个控件,图片自动切换,形成动画效果. 随便的码码,码完发现东西太少了,不过还算完善. public class MyPictureBox : PictureBox { Timer timer ...
- Mongodb安装与配置详解
简介: mongodb作为一款通用型数据库,除了能够创建,读取,更新和删除数据外,还提供一系列不断扩展的独特功能. a.索引: mongodb支持二级索引,允许多种快速查询,且提供和唯一索引,复合索引 ...
- Java中的数是用补码表示的检验
一.基本介绍(关于下列五个定义来自http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html#!comments,谢原 ...
- 信息加密之非对称加密算法RSA
前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码, ...
- android target unknown and state offline解决办法
没有错,将adb的版本升级一下就好了! 下载地址为:http://files.cnblogs.com/files/hujunzheng/adb1.0.32.zip
- Request.UrlReferrer 使用
最近有一个功能是反馈统计,然后在反馈建议里面添加是从哪个页面点击过来的,一开始打算做成&url=这种方法加在链接里面然后页面接受参数,后来知道了request.UrlReferrer 知道他可 ...
- HTML5第一讲
第一回合:什么是HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTM ...
- JS Replace() 全部替换字符的用法
好久不写js了,今早遇到替换字符的,就浪费了点时间,由此,要记录下来.replace()方法:楼主有个字符串,需要替换掉其中的一些字母,如: var test='123helo123boy123hi' ...
- 基于HTML5树组件延迟加载技术实现
HT for Web的HTML5树组件有延迟加载的功能,这个功能对于那些需要从服务器读取具有层级依赖关系数据时非常有用,需要获取数据的时候再向服务器发起请求,这样可减轻服务器压力,同时也减少了浏览器的 ...