当前位置: 首页 > Linux

Redis学习数据持久化与数据恢复

时间:2023-04-06 07:20:23 Linux

redis缓存是一种支持数据持久化的操作,即可以将内存中的数据持久化到硬盘中,有点类似于数据库,这也是两者的区别之一redis和内存缓存。Redis数据持久化常用的方式有两种:Snapshotting(RDB)在指定的时间间隔内生成数据集的时间点快照,这也是redis默认的持久化方式。AppendOnlyFile(AOF)持久化记录服务器执行的所有操作命令,并在服务启动时通过重新执行这些命令来恢复数据集。如何生成RDB:通过执行命令手动生成。Save和BGSAVE命令可用于持久化数据并生成RDB文件。SAVE命令会阻塞当前的服务进程。在阻塞期间,服务器无法处理任何命令请求,直到缓存数据持久化完成。BGSAVE命令,顾名思义,在后台执行,不会阻塞当前服务,会派生一个子进程,负责持久化数据,父进程继续处理命令请求。通过配置自动生成可以通过redis.conf配置文件找到SNAPSHOTTING配置,修改save选项,让服务器每隔一段时间自动执行BGSAVE。配置如下:#################################SNAPSHOTTING####################################将数据库保存在磁盘上:##save##如果给定的秒数和给定的#对数据库的写操作发生,将保存数据库。##在下面的示例中,行为将保存:#在900秒(15分钟)后,如果至少有1个键被更改#在300秒(5分钟)后,如果至少有10个键被更改#在60秒后,如果至少有10000个键已更改##注意:您可以在注释所有“保存”行时完全禁用保存。save9001//服务器在900秒内至少修改了一次缓存数据库save30010//服务器在300秒内至少修改了一次缓存数据库save6010000//服务至少修改了缓存数据库10000次within60seconds#转储.rdb数据库时使用LZF压缩字符串对象?#默认情况下设置为“是”,因为它几乎总是胜利。#如果你想在保存子进程中节省一些CPU,将它设置为“否”但是#如果你有可压缩的值或键,数据集可能会更大。rdbcompressionyes#ThefilenamewheretodumptheDBdbfilenamedump.rdb//持久化数据保存到磁盘的文件名#工作目录。##数据库将被写入此目录中,并使用上面使用“dbfilename”配置指令指定的文件名。##还将在此目录中创建仅附加文件。##注意这里一定要指定目录,不是文件名。dir.///保存到磁盘的路径只要满足以上三种保存配置之一,redis就会自动对数据进行快照并持久化到硬盘。用户可以根据自己的需要进行配置。看到上面的配置,我会很好奇,服务器怎么知道我在多长时间内修改了多少次缓存数据呢?后来发现Redis服务有一个dirty和一个lastsave时间戳。服务器执行数据修改命令后,脏计数器值将被更新。lastsave是记录服务器上次执行BGSAVE命令的时间,这里不做详细说明。AOFAOF通过保存Redis服务的所有操作命令来持久化数据,并在下次启动服务时重新执行这些操作命令来恢复缓存的数据。刷新AOF文件的三种方式:1.appendfsyncalways——每次提交修改命令时调用fsync刷新到AOF文件,非常非常慢,但是也很安全2.appendfsynceverysec——调用fsync刷新到每秒AOF文件,非常快,但可能一秒内丢失数据3.appendfsyncno-依赖OS刷新,redis不主动刷新AOF,速度最快,但安全性较差。默认并建议每秒刷新一次,既速度又安全数据恢复已考虑在内:RDBRDB没有专门的恢复数据的操作命令。当redis服务启动时,会自动搜索RDB文件并加载,并引导RDB文件,直到加载完成。AOF服务器启动时,通过加载并执行保存在AOF文件中的命令,恢复服务器关闭前的数据库状态。具体过程:(1)加载AOF文件(2)创建模拟客户端(3)从AOF文件读取命令(4)使用模拟客户端执行命令(5)循环读取并执行命令直到全部完成。如果同时启用了RDB和AOF,则AOF优先,启动时只加载AOF文件恢复数据