怎么推广自己的网站,营销推广ppt,网络营销的推广工具,工作是否能给我们带来快乐1.持久化一提到持久化#xff0c;我们就会第一时间联想到M有SQL的事务#xff0c;MySQL事务有四个比较核心的特征#xff1a;原子性#xff08;把多个操作打包成一个整体#xff09;#xff0c;一致性#xff08;事务执行之前和之后#xff0c;数据都不能离谱#xff…1.持久化一提到持久化我们就会第一时间联想到M有SQL的事务MySQL事务有四个比较核心的特征原子性把多个操作打包成一个整体一致性事务执行之前和之后数据都不能离谱持久性事务中做出的修改都会保存在硬盘上隔离性事务并发执行涉及一系列的问题Redis是一个内存数据库数据存储在内存中内存中的数据是不持久化的要想做到持久化就需要让Redis把数据存储到硬盘上。Redis决定内存中存储数据快硬盘中也存数据持久化。当要插入到一个新的数据时就需要把这个数据写入到内存和硬盘上当查询这个数据的时候直接从内存中读取硬盘中的数据知识在Redis重启的时候用来恢复内存中的数据但代价是消耗更多的空间毕竟一份数据存两遍。持久化可以简单理解为数据存储硬盘上Redis支持RDB和AOF两种持久化机制持久化功能有效地避免因进程退出造成数据丢失的问题当下次重启时候利用之前持久化生成的文件即可实现数据的恢复。2.RDBRDB持久化就是把当前进程中的数据生成快照保存到硬盘的过程触发RDB持久化过程分为手动触发和自动触发Redis会定期给内存中当前存储这些数据拍成一个快照生成一个文件存储在硬盘中后续Redis一旦重启内存数据就没了可以根据快照文件把内存中的数据恢复回来。2.1触发机制2.1.1手动触发程序员通过Redis客户端执行特殊的命令来触发生成快照。手动触发分别对应的save和bgsave命令save命令阻塞当前Redis服务器直到RDB过程完成为止对于内存比较大的实例造成长时间阻塞基本不采用。bgsave命令Redis进程执行fork操作创建子进程RDB持久化过程由子进程负责不会影响Redis服务器处理其他客户端的请求和命令完成后自动结束。阻塞只发生在fork阶段一般时间很短。Redis内存所有设计RDB的操作都采用类似的bgsave的方式。2.1.2自动触发除了自动触发外Redis运行自动触发Redis配置文件中RDB持久化这个触发机制才是比较有价值的1.使用save配置如save m n 表示m秒内数据集发生n次修改自动触发RDB持久化2.从节点进行全量复制的时候主节点自动进行RDB持久化随后将RDB文件发送给从节点3.执行shutdown命令关闭Redis时执行RDB持久化。2.2流程说明bgsave是主流的RDB持久化方式 bgsave命令的运行流程1.执行bgsave判断当前是否已经存在其他正在工作的子进程如果有其他进程正在bgsave此时就直接把当前的bgsave返回2.如果没有其他子进程就通过fork这个样的系统调度一个子进程来fork过程中会阻塞可以通过info status 命令查看lastest_fork_usec选项可以获取最近一次fork操作的耗时单位为微秒。3.父进程完成fork后bgsave命令返回Background saving started信息并不再阻塞父进程生成快照的过程中父进程继续接受客户端的请求继续提供服务。4.子进程创建RDB文件根据父进程内存生产临时快照文件完成后对原有文件进行原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间对应info统计rdb_last_save_time选项5.子进程发送信号给父进程表示完成父进程更新统计信息。fork是linux系统提供的一个创建子进程的api系统调用fork创建子进程简单粗暴直接把当前父进程复制一份作为子进程。一旦复制完成父子进程就是两个独立的进程格子执行各自的任务。fork复制的过程中会复制pcb虚拟地址空间内存中的数据文件描述符表。本来Redis Server中若干变量保存了一些键值对随着这样的fork进行子进程的这个内存空间也会存在和父进程中一摸一样的数据。接下来安排子进程去执行持久化操作也就相当于父进程本地这里的内存数据给持久化了。父进程打开一个文件fork之后子进程同样可以使用该文件也就导致了子进程持久化写入的那个文件和父进程本来要写的文件是同一个。这个时候就会有人问了如果当前Redis服务器中存储的数据特别多内存消耗特别大进行上述复制操作是否有很大的性能开销此处的性能开销其实挺小的。fork在进行内存拷贝时不是简单无脑将所有元素复制一份而是通过写时拷贝的机制完成的。如果父进程和子进程的内存数据完全相同此时不会触发真正的拷贝动作父子使用一份内存但是这两个进程的内存空间应该是各自独立完成的。一旦某一个进程对内存数据做了修改就会触发真正的物理内存上的数据拷贝。在进行bgsave这个场景中绝大部分的内存是不需要修改的因此子进程的写时拷贝并不会触发很多次也保证了整体拷贝的时间时可控的高效的。2.3RDB文件的处理2.3.1保存保存RDB文件保存在dir配置的指定目录默认/var/lib/redis/下文件名通过dbfilename配置默认dump.rdb指定。可以通过执行config set dir {newDir} 和 config set dbfilename {newFilename}运行期间动态执行当下次运行的RDB文件会保存到新的目录。当生成的RDB镜像操作的时候此时就会生成快照数据先保存在一个临时的文件中当快照生成完毕之后再删除之前的rdb文件把新生成的临时rdb文件改为dump.rdb。自始至终rdb文件始终有一个2.3.2 压缩压缩Redis默认采用LZF算法对生成的RDB文件做压缩处理压缩处理后的文件远远小于呢哦村大小默认开启可以通过参数config set rdbcompression {yes | no} 动态修改。虽然压缩 RDB文件会消耗CPU但可以大幅度减低文件的体积方便保存到硬盘或通过网络发送到从节点因此建议开启。2.3.3 校验校验如果Redis启动时加载到损坏的RDB文件会拒绝启动这是可以使用Redis 提供的redis-check-dump工具检测RDB文件并获取对应的错误报告其实是一个符号链接在启动redis的时候就是进行检查rdb文件的完整性 2.4 RDB文件优缺点优点RDB是紧凑压缩的二进制文件代表Redis在某个时间点上生成的数据快照。非常适用于备份全量复制等场景把RDB文件复制到远程机器或者是文件系统中用于灾备。Redis加载RDB恢复数据非常快二进制缺点RDB方式持久化数据无法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork创建子进程俗语重量级操作频繁执行成本高。RDB文件使用特定的二进制格式保存。Redis版本严谨过程中有多个RDB版本兼容性可能有风险。