【redis】-- redis的持久化(作为数据库)
redis是一个基于内存的数据库,故在redis正在运行的数据都在内存中,而内存掉电,内存上所以数据都会消失。故把redis当成数据库使用时就需要对redis进行持久化。
在说redis持久化的时候,我们先来聊聊其他的知识。linux的父子进程。在Linux中使用fork()函数会给当前正在运行的进程创建一个子进程。那么现在问题就来了,fork时父子进程中的数据有什么关系呢?一般说到进程我们都会知道进程间彼此是数据隔离的。然而实际上,子进程在刚创建时,可以看到子进程中的数据。而在修改该数据时,却不会对父进程造成影响。同样子进程也不会受到父进程修改数据的影响。而造成这种现象的,正是因为linux的copy on write机制。
copy on write:是一种内核机制,通俗来讲就是写时复制。及创建子进程并不发生复制,创建子进程后父子进程共用数据。只有在修改数据是才会创建新的空间。
这样做的好处是创建进程变快了。而且根据开发经验,我们创建子进程后不可能父子进程把所有数据都改一遍。而这套机制就是指针支撑的。玩的是指针
redis中有两种数据到存储方式,rdb和aof。下面我们来着重讲一下这两种持久化方式:
1.RDB
rdb持久化的方式
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
redis的rdb持久化方式有存储的是时点数据即某一个时间点的数据。因为如果存储实时更新的数据的话,如果一直有数据写入会导致,持久化过程一直进行,降低了redis的快捷的特性。因此redis有两种持久化数据的方式
- save:前台更新数据,如果使用这种方法持久化,那么只能在服务器停机维护时,发生因为它会阻塞redis进程造成redis的服务不可用。
- bgsave:后台运行,该命令的原理是,创建一个子进程来进行redis的持久化,而redis依然提供服务。此时就用到了刚才讲到的copy on write机制,父子进程共用了一套数据。
以上两个命令直接可以在redis的客户端运行。
注意如果使用配置文件的方式配置数据持久化,配置文件中给出bgsave的规则: save这个标识。配置的规则:(要修改的文件是dbfilename dump.rdb,文件一般存储在var/lib/redis/6379)
save 900 1
save 300 10
save 60 10000
该规则意味着,在每60秒检测一次redis的数据量,如果达到10000就进行持久化,否则不持久化。在每300秒检测一次redis的数据量,如果达到10就进行持久化,否则不持久化。在每900秒检测一次redis的数据量,如果达到1就进行持久化,否则不持久化。
rdb方式的优点:
- RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.
- RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复.
- RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
- 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.
rdb的缺点
- 如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据.
- RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度.
- 不支持拉链化,只有一个rdb文件
- 丢失数据相对多一些时点与时点之间窗口数据容易丢失。8点得到一个rdb,9点刚要写一个rdb,挂机了。那么8~9之间的数据就会丢失。
2.AOF
AOF实际是把对redis操作的操作记录,通过日志的方式记录下来,这样想要恢复数据库文件,只需要把所以指令执行一遍就行。
需要开启aof只需要把dump修改appendonly该为yes即可。
appendonly yes
aof的优点
- 使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.
- AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题.
- Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
- AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态
aof的缺点
弊端,体量无线变大, 恢复慢
为解决aof的弊端日志,优点如果能保住,还是可以用的。就有一个方案:设计一个方案让日志,AOF足够小
就是hdfs,fsimage+edits.log 。让日志只记录增量,合并操作的中间过程。
而4.0版本也是这项技术的分界点
- 4.0以前进行重写时,删除抵消的命令合并重复的命令。这样最终也是一个纯指令的日志文件
- 4.0以后将老的数据RDB到aof文件中,将增量的以指令的方式Append到AOFAOF是一个混合体。其利用了RDB的快,利用了日志的全量
从这点可以看出,aof和rdb是可以共存的。
3.持久化的其他特性
日志重写
Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令; Redis 2.4 则可以自动触发 AOF 重写, 具体信息请查看 2.4 的示例配置文件。
工作原理
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制:
- Redis 执行 fork() ,现在同时拥有父进程和子进程。子进程开始将新 AOF 文件的内容写入到临时文件。
- 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾,这样样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
- 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。
redis的持久化想要开启其实挺简单的只需要,修改conf配置文件的几个配置项即可。
rdb和aof混合使用
当二者混合使用时,如果redis服务器停止后重新运行,那么redis恢复数据只会从aof中同步,而不会去向rdb同步。而且在主从复制时,rdb会记录上一次连接的端口,而aof不会。所以主从复制时,如果没有开启aof,那么从服务器在断开主服务器后重新连接主服务器,只会同步从服务器断开时的增量数据,而开启aof后从服务器需要同步主服务器中的所有内容。
【redis】-- redis的持久化(作为数据库)的更多相关文章
- Java实现Redis持久化到数据库的关键方法
import java.util.Date; import java.util.Iterator; import java.util.Set; import redis.clients.jedis ...
- Redis两种持久化方式(RDB&AOF)
爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...
- Redis提供的持久化机制(RDB和AOF)
Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...
- Redis学习手册(持久化)
一.Redis提供了哪些持久化机制: 1). RDB持久化: 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘. 2). AOF持久化: 该机制将以日志的形式记录服务 ...
- redis学习--的持久化数据备份(RDB和AOF)
接上一篇:安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目 一.dump.rdb文件是怎么生成的 二.什么是redis持 ...
- redis 系列16 持久化 RDB
一.概述 Redis是内存数据库,一旦服务器进程退出,服务器中的数据库内存数据状态也会消失.为了解决这个问题,Redis提供了RDB 持久化功能,这个功能可以将redis在内存中的数据库状态保存到磁盘 ...
- redis简介与持久化
一 . redis简介 redis属于NoSQL学名(not only sql) 特点: 存储结构与mysql这一种关系型数据库完全不同,nosql存储的是key value形式 nosql有很多产品 ...
- mysql主从复制、redis基础、持久化和主从复制
一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...
- Linux 安装redis,redis发布订阅,持久化
安装redis 1.安装redis的方式 -yum (删除这个yum安装的redis,我们只用源码编译安装的) -rpm -源码编译 2.删除原本的redis yum remove redis -y ...
- redis 事务,持久化,日志,主从,VM
redis目前对事务的支持比较简单,只能保证一个客户端连接发起事务中的命令可以连续执行,而中间不会插入其他客户端的命令. 1.事务 一般情况下,redis接收到一个客户端发送的命令,立刻执行并返回结果 ...
随机推荐
- P2871 [USACO07DEC]手链Charm Bracelet(01背包模板)
题目传送门:P2871 [USACO07DEC]手链Charm Bracelet 题目描述 Bessie has gone to the mall's jewelry store and spies ...
- TensorFlow——Graph的基本操作
1.创建图 在tensorflow中,一个程序默认是建立一个图的,除了系统自动建立图以外,我们还可以手动建立图,并做一些其他的操作. 下面我们使用tf.Graph函数建立图,使用tf.get_defa ...
- 使用“1”个参数调用“DownloadString”时发生异常:“操作超时”
我今天在终端美化时间遇到一个问题是这样的 使用“1”个参数调用“DownloadString”时发生异常:“操作超时” 然后网我看了下,访问链接属于https的东西,根据直觉我觉得是这样的,是由于访问 ...
- c++快读与快输模板
快读 inline int read() { ; ; char ch=getchar(); ; ch=getchar();} )+(X<<)+ch-'; ch=getchar();} if ...
- 完美解决win10系统无法安装.NET Framework问题
今天在安装willow插件的时候系统提示需要安装.NET Framework3.5的问题,当点击系统自动解决的时候,Windows系统又会提示错误,其实这也见怪不怪了,如果能自动解决的话也不会出现这种 ...
- 数学基础系列(六)----特征值分解和奇异值分解(SVD)
一.介绍 特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景. 奇异值分解是一个有着很明显的物理意义的一种方法,它可 ...
- macOS 10.11.* 安装scrapy
1.安装brew,然后修改brew源为某高校 2.更新python brew install python 3.安装pip 4.安装scrapy,这里肯定会有一个坑,之前在网上看到10.11开启了什么 ...
- python+opencv中最近出现的一些变化( OpenCV 官方的 Python tutorial目前好像还没有改过来?) 记一次全景图像的拼接
最近在学习过程中发现opencv有了很多变动, OpenCV 官方的 Python tutorial目前好像还没有改过来,导致大家在学习上面都出现了一些问题,现在做一个小小的罗列,希望对大家有用 做的 ...
- Stream排序Map集合
最近小编自己一个人在负责一个项目的后台开发,其中有一部分是统计相关的功能,所以需要一些排序或者分组的操作,之前这种操作小编觉得还是比较麻烦的,虽热有一些现成的工具类,但是工具类的写法也是比较复杂的,但 ...
- hge引擎使用技巧
图片周围最好留出一像素,即上下左右都多出一像素.然后使用pngopt.exe处理一下.这样可以减少图片拉伸.旋转时边界模糊的情况 图片宽高最好是 2的N次方