Redis由于支持非常丰富的内存数据结构类型,如何把这些复杂的内存组织方式持久化到磁盘上是一个难题,所以Redis的持久化方式与传统数据库的方式有比较多的差别,Redis一共支持四种持久化方式,分别是:
- 定时快照方式(snapshot)
- 基于语句追加文件的方式(aof)
- 虚拟内存(vm)
- Diskstore方式
在设计思路上,前两种是基于全部数据都在内存中,即小数据量下提供磁盘落地功能,而后两种方式则是作者在尝试存储数据超过物理内存时,即大数据量的数据存储,截止到本文,后两种持久化方式仍然是在实验阶段,并且vm方式基本已经被作者放弃,所以实际能在生产环境用的只有前两种,换句话说Redis目前还只能作为小数据量存储(全部数据能够加载在内存中),海量数据存储方面并不是Redis所擅长的领域。下面分别介绍下这几种持久化方式:
定时快照方式(snapshot):
该持久化方式实际是在Redis内部一个定时器事件,每隔固定时间去检查当前数据发生的改变次数与时间是否满足配置的持久化触发的条件,如果满足则通过操作系统fork调用来创建出一个子进程,这个子进程默认会与父进程共享相同的地址空间,这时就可以通过子进程来遍历整个内存来进行存储操作,而主进程则仍然可以提供服务,当有写入时由操作系统按照内存页(page)为单位来进行copy-on-write保证父子进程之间不会互相影响。
该持久化的主要缺点是定时快照只是代表一段时间内的内存映像,所以系统重启会丢失上次快照与重启之间所有的数据。
基于语句追加方式(aof):
aof方式实际类似mysql的基于语句的binlog方式,即每条会使Redis内存数据发生改变的命令都会追加到一个log文件中,也就是说这个log文件就是Redis的持久化数据。
aof的方式的主要缺点是追加log文件可能导致体积过大,当系统重启恢复数据时如果是aof的方式则加载数据会非常慢,几十G的数据可能需要几小时才能加载完,当然这个耗时并不是因为磁盘文件读取速度慢,而是由于读取的所有命令都要在内存中执行一遍。另外由于每条命令都要写log,所以使用aof的方式,Redis的读写性能也会有所下降。
虚拟内存方式:
虚拟内存方式是Redis来进行用户空间的数据换入换出的一个策略,此种方式在实现的效果上比较差,主要问题是代码复杂,重启慢,复制慢等等,目前已经被作者放弃。
diskstore方式:
diskstore方式是作者放弃了虚拟内存方式后选择的一种新的实现方式,也就是传统的B-tree的方式,目前仍在实验阶段,后续是否可用我们可以拭目以待。
Redis持久化磁盘IO方式及其带来的问题
有Redis线上运维经验的人会发现Redis在物理内存使用比较多,但还没有超过实际物理内存总容量时就会发生不稳定甚至崩溃的问题,有人认为是基于快照方式持久化的fork系统调用造成内存占用加倍而导致的,这种观点是不准确的,因为fork 调用的copy-on-write机制是基于操作系统页这个单位的,也就是只有有写入的脏页会被复制,但是一般你的系统不会在短时间内所有的页都发生了写入而导致复制,那么是什么原因导致Redis崩溃的呢?
答案是Redis的持久化使用了Buffer IO造成的,所谓Buffer IO是指Redis对持久化文件的写入和读取操作都会使用物理内存的Page Cache,而大多数数据库系统会使用Direct IO来绕过这层Page Cache并自行维护一个数据的Cache,而当Redis的持久化文件过大(尤其是快照文件),并对其进行读写时,磁盘文件中的数据都会被加载到物理内存中作为操作系统对该文件的一层Cache,而这层Cache的数据与Redis内存中管理的数据实际是重复存储的,虽然内核在物理内存紧张时会做Page Cache的剔除工作,但内核很可能认为某块Page Cache更重要,而让你的进程开始Swap ,这时你的系统就会开始出现不稳定或者崩溃了。我们的经验是当你的Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了。
下图是Redis在读取或者写入快照文件dump.rdb后的内存数据图:
总结:
- 根据业务需要选择合适的数据类型,并为不同的应用场景设置相应的紧凑存储参数。
- 当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大的内存使用量。
- 如果需要使用持久化,根据是否可以容忍重启丢失部分数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存以及diskstore方式。
- 不要让你的Redis所在机器物理内存使用超过实际内存总量的3/5。
相关推荐
1. Redis使用的持久化机制(存储数据的方式) (1)RDB 1) RDB:是redis的默认持久化机制。 RDB相当于照快照,保存的是一种状态。如果你有几十G数据 ,它能把它压缩为 几KB的快照 2)快照是默认的持久化方式,这种方式...
Redis持久化就是将数据存入磁盘,以保证数据在redis在崩溃时减小对数据的影响,redis提供两种持久化方式。 1.快照(snapshotting)方式RDB,RDB是redis默认的持久化方式,可以再redis.conf中配置其存储频度,如图: ...
Redis 的持久化机制有哪些??
Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存...
RDB是Redis内存到硬盘的快照,用于redis持久化,创建RDB二进制文件,将存储在内存中的数据,持久化的放到硬盘中,当我们需要这些数据的时候,启动载入RDB文件,数据将会被存入内存中,其实RDB就是一种快照的方式持久...
2.3 Redis持久化机制 2.4 Redis高级特性和集群 3. MySQL数据库篇 3.1 MySQL简介和基本操作 3.2 数据库设计范式和优化 3.3 事务和并发控制 3.4 索引和优化技巧 4. 框架篇 4.1 Spring框架概述 4.2 Spring...
内容包含,1.简介 2.安装过程 3.基本操作,key,string,list,set,hash,zset,Geospatial,hyperloglogs 4.Redis持久化机制 5.Redis事务控制 6.Redis主从复制机制 7.发布订阅 8,总结
2. redis持久化机制 a. RDB:快照形式是直接把内存中的数据保存到⼀个 dump ⽂件中,定时保存,保存策略。(会丢数据) b. AOF:把所有的对Redis的服务器进⾏修改的命令都存到⼀个⽂件⾥,命令的集合。(影响性能) ...
本文详细探讨了Redis的三大高级特性:持久化、主从复制和哨兵机制。首先,我们探讨了Redis的两种持久化方式:RDB和AOF。RDB通过定期生成数据快照来实现数据的持久化,而AOF则记录每个写操作,提供更强的数据安全性。...
- RDB持久化机制: - RDB默认开启 - RDB存储二进制数据,RDB在持久化和读取持久化文件时,速度较快 - RDB持久化的时机: save second keys # 在second时间内,执行了key次写操作,就执行RDB的持久化 - 优缺点...
Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RDB 和 AOF 两种持久化方案,包括操作方法和持久化的实现...
一、Redis提供了哪些持久化机制: 1). RDB持久化: 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2). AOF持久化: 该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器...
redis的持久化也就是数据落地,对于任何一个数据系统都要考虑是不是需要数据落地。在系统崩溃或是机房掉电等的情况下,将有用的数据记录在非易失性存储器上面,防止数据丢失,以及用来系统重启时的数据恢复。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的...
Redis持久化机制 刚看到标题你可能会说,我知道,不就是RDB和AOF嘛。这些已经是老生常谈了。那么我们今天就深入谈谈这两种持久化方式的逻辑和原理。 RDB的原理 在Redis中RDB持久化的触发分为两种:自己手动触发与...
1. redis各种应用场景 2. redis持久化机制 4. 有没了解Docker,Docker和虚拟机有什么区别 1. docker启动快速属于秒级别 2.
Redis支持RDB与AOF两种持久化机制,持久化可以避免因进程异常退出或down机导致的数据丢失问题,在下次重启时能利用之前的持久化文件实现数据恢复。 RDB持久化 RDB持久化即通过创建快照(压缩的二进制文件)的方式...
0302 RDB持久化机制 0303 RDB数据恢复案例 0304 AOF持久化机制. 0305 AOF数据恢复案例 0306 Redis线程模型 0307 Redis过期数据淘汰 0308 listpack 0309 碎片整理 0310 SLOWLOG 0311 Latency Monitoring 0312 SSL ...