职校网站模板,网站开发与网站设计区别,网上开店准备工作,网络营销就业前景和薪水个人主页 #xff1a; 个人主页 个人专栏 #xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言RDBAOF总结 前言
redis是一个内存数据库#xff0c;把数据存储在内存中的#xff0c;而内存中的数据是不持久的#xff0c;要想能够做… 个人主页 个人主页 个人专栏 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言RDBAOF总结 前言
redis是一个内存数据库把数据存储在内存中的而内存中的数据是不持久的要想能够做到持久就需要让redis把数据存储到硬盘上。但redis相比于mysql这样的关系型数据库最明显的特点就是效率高速度快。这样便导致redis为了保证速度快数据要存储在内存中又为了持久化数据要存储到硬盘中 当要插入一个新的数据时需要把这个数据“同时”写入到内存和硬盘当要查询某个数据时直接从内存读取硬盘数据只是在redis重启的时候用来恢复内存中的数据的。 redis支持RDB(Redis DataBase)和AOF(Append Only File)两种持久化机制
RDB
RDB定期的把redis内存中的所有数据都给写入硬盘中生成一个快照之后redis一旦重启就可以根据刚才的快照把内存中的数据恢复回来。 定期具体而言又两种方式手动触发自动触发 手动触发 save命令阻塞当前redis服务器直到RDB过程完成为止。会导致类似于 keys *的后果一般不建议使用save bgsave命令redis进程执行 fork 操作创建子进程RDB持久化过程由子进程负责完成后自动结束阻塞只发生在fork阶段 redis内部所有涉及到RDB的操作都采用类似bgsave的方式 2.自动触发 在redis配置文件中(linux中redis的默认配置文件路径是/etc/redis/redis.conf)设置下使redis每隔多长时间和每产生多少次修改就触发 使用save配置如save m n表示 m秒内数据集发送了 n 次修改自动RDB持久化 通过shutdown 命令关闭redis服务器也会触发 service redis-server restart 正常关闭 redis 进行主从复制的时候主节点也会自动生成RDB快照然后把RDB快照文件内容传输给从节点 bgsave命令的运行流程 执行bgsave命令redis父进程判断当前进程是否存在其它正在执行的子进程如RDB/AOF子进程如果存在bgsave命令直接返回父进程fork完成后bgsave命令会返回Background saving started 信息并不再阻塞父进程父进程可以继续响应其它命令子进程创建RDB文件根据父进程内存生成临时快照文件完成后对原有文件进行原子替换子进程发送信号给父进程表示完成父进程更新统计信息 redis生成的rdb文件存放在redis的工作目录中的可以在redis配置文件中进行设置 dump.rdb就是rdb机制生成的镜像文件redis服务器默认的就是开启rdb的dump.rdb文件就是二进制文件把内存中的数据以压缩的形式(默认采用LZF算法)保存到这个二进制文件中。 后续redis服务器重新启动就会尝试加载这个rdb文件如果发现格式错误可能会加载数据失败 redis-check-rdb是redis提供的rdb文件检查工具 RDB是一个紧凑压缩的二进制文件代表redis在某个时间点上的数据快照。非常适用于备份全量复制等场景。比如每6个小时执行bgsave备份并把RDB文件复制到远端机器或者文件系统中用于灾备redis加载RDB恢复数据远远快于AOF的方式RDB使用二进制的方式组织数据直接把数据读取到内存中按照字节的格式取出来放到结构体/对象中即可但AOF是使用文本的方式来组织数据则需要进行一系列的字符串切分RDB方式数据每办法走到实时持久化/秒级持久化bgsave每次运行都需要执行fork创建子进程属于重量级操作频繁执行成本过高RDB文件使用特定二进制格式保存redis版本演进过程有多个RDB版本兼容可能有风险可以通过写一个程序直接遍历旧的redis中的所有key把数据取出来插入到新的redis服务器中 AOF
redis的AOF(Append Only File)机制是一种持久化机制用于将redis服务器接收到的所有写操作命令以追加的方式写入到磁盘中的日志文件中重启时再重新执行AOF文件中的命令达到恢复数据的目的。 AOF的主要作用是解决数据持久化的实时性 开启AOF功能需要设置配置appendonly yesAOF文件名通过appendfilename配置所在目录和RDB一样(/var/lib/redis) 所有的写入命令会追加到aof_buf(缓冲区)中AOF缓冲区根据对应的策略向硬盘做同步操作随着AOF文件越来越大需要定期对AOF文件进行重写达到压缩目的当redis服务器启动时可以加载AOF文件进行数据恢复
redis执行命令速度快的重要原因是直接操作内存现在引入AOF后又要写内存又要写硬盘还可以想之前一样快吗实际上并没有影响到redis处理请求的速度有以下两个原因
AOF机制并非是直接让工作线程把数据写入硬盘而是先写入一个内存中的缓冲区先积累一部分再统一写入硬盘这样大大降低了写硬盘的次数硬盘上读写数据顺序读写的速度是比较快的(比内存还是慢很多)AOF是每次把新的操作写入到原有文件的末尾属于顺序写入
但缓冲区的数据还是在内存中如果redis服务器突然挂了缓冲区的数据就丢了。 redis给出一些选项让我们选择缓冲区的刷新策略
刷新频率越高性能影响就越大数据可靠性就越高 刷新评率越低性能影响就越小数据可靠性就越低
系统调用write 和 fsync说明
write操作会触发延迟写(delayed write)机制linux在内核提供页缓冲区用来提高硬盘IO性能write操作在写入系统缓冲区后立即返回同步硬盘操作依赖于系统调度机制如缓冲区页空间写满或到达特定时间周期。同步文件之前如果此时系统故障宕机缓冲区内数据丢失fsync针对单个文件操作做强制硬盘同步fsync将阻塞直到数据写入到硬盘配置为always时每次写入都要同步AOF文件性能很差在一般的SATA硬盘上只能支持大约几百TPS写入。配置为no时由于操作系统同步策略不可控虽然提供了性能但数据丢失风险大大提高配置everysec是默认配置兼顾数据安全和性能。理论上最多丢失1秒的数据 AOF文件持续增长体积越来越大会影响到redis下次启动的启动时间redis启动的时候要读取aof文件内容(记录中间过程)而这个AOF文件有一些内容是多余的。 类似上述操作实际上AOF只需要记录 set key 5即可。 因此redis就存在一个机制能够针对AOF文件进行整理操作也就是能够删除多余的内容使AOF文件大小变小
AOF重写过程可以分为手动触发和自动触发 手动触发调用bgrewriteaof命令 自动触发根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定自动触发时间
auto-aof-rewrite-min-size触发重写时AOF的最小文件大小auto-aof-rewrite-percentage当前AOF占用大小相比上次重传写时增加的比例 执行AOF重新请求如果当前进程正在执行AOF重写请求不执行如果当前进程正在执行bgsave操作重新命令延迟到bgsave完成之后再执行 父进程执行fork创建子进程 父进程继续响应其它命令所有写入命令仍然写入AOF缓冲区并根据appendfsync策略同步到硬盘保证旧AOF文件机制正确(重写过程中如果redis服务器挂了可以根据旧AOF文件恢复数据)子进程根据内存快照将命令合并到新的AOF文件中 子进程完成重写新AOF文件写入后子进程发送信号给父进程父进程把AOF重写缓冲区内临时保存的命令追加到新的AOF文件中用新AOF文件替换旧AOF文件 注意 重写的时候不关心AOF文件中原来都有什么只关心内存中最终的数据状态子进程只需要把内存中当前的数据获取出来以AOF格式写入到一个新的AOF文件中内存中的数据状态就已经相当于把旧AOF文件结果整理后的样子; RDB对于fork之后的新数据就直接置之不理AOF则对于fork之后的新数据采用aof_rewrite_buf缓冲区的方式来处理这是因为RDB本身的设计理念就是用来“定期备份”的AOF的设计理念是“实时备份” AOF本来是按照文本的方式写入文件的但文本的方式写入文件后续加载成本比较高redis就引入了“混合持久化”的方式结合了RDB和AOF的特点 按照AOF的方式把每一个请求/操作都记录文件在触发AOF重写之后把当前内存的状态按照RDB的二进制格式写入到新的AOF文件中后续再进行的操作仍然按照AOF文本的方式追加到文件后面 该选项为 yes 表示开启混合持久化 当redis上同时存在AOF文件和RDB快照时启动redis以谁为主以AOF为主RDB直接被忽略了AOF中包含的数据比RDB更全。 总结
以上就是我的redis学习笔记