redis 之数据持久化

redis持久化是什么

redis 是基于内存的,当你的内存关闭后数据则消失了。但是有的需求是数据继续保留当你下一次连接打开的时候 数据还在。这里就可以使用redis的数据持久化,它是每隔多少时间把你的数据自动存储到你的磁盘里生成持久化文件。这样就能实现数据的保留(个人理解)

(redis5.0之前是单线程的,6.0版本是多线程的,redis服务端接收客户端发送的请求,会生成一个队列,一个一个进行处理)

redis实现数据持久化提供了两种方式:

RDB:指定的时间间隔内保存数据快照

AOF:先把命令追加到操作日志的尾部,保存所有的历史操作

RDB: 直接基于内存数据 生成持久化文件

redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据(变量。环境变量,程序程序计数器等)  都和父进程一模一样。子进程会将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能

redis RDB持久化机制什么时候触发?

在文章开头讲了redis每隔多少时间把你的数据自动存储到你的磁盘里生成持久化文件,这里只说到了定时任务触发机制。其实远不止如此。如下举例

shutdown(正常关机)时,如果没有开启AOF,会触发

定时任务持久化配置 redis快照持久化配置redis.config

执行命令save或者bgsave 

save:save命令是使用主进程进行持久化。只管保存,其他不管,任务全部进行阻塞,

bgsave: 创建子进程进行持久化 redis会在后台异步进行快照操作,同时可以响应客户端的请求 非阻塞

执行flushall命令 (仅仅是清楚内存当中的数据,不会清楚文件缓存中的数据) 但是里面是空的,无意义

redis持久化生成的文件和临时文件在哪里呢?

redis开机时会读取持久化文件,默认文件位置在启动当前目录 dump.rdb文件。

注意:rdb 文件名字配置redis.conf  如果导入rdb文件必须和配置文件名称相同

注意:如果你更换了目录位置启动redis,数据就会消失。因为在当前目录找不到持久化文件。并不是数据消失只要还在之前目录进行启动,数据就还在

解决方案:

这个位置是可以更改的,在你的redis.conf配置文件里面 找到 dir ./ 这个“./”就是redis运行过程当中所有产生的文件都会存储到这个目录下包括持久化文件.可以更改为自己指定的目录下,这样就能避免在不同目录启动数据持久化文件储存的位置都能找到。

AOF和RDB持久化可以共存

RDB持久化的缺点

也就解释了为什么会出现AOF持久化,redis RDB持久化进行数据持久化时,如果突然意外宕机,写入的数据还没有完全进行持久化操作,写入的数据就会丢失。

AOF: 记录命令字符串 开机时执行命令就能恢复数据(只会记录增删改,不会记录读取命令)

例如: set key value

AOF的出现就是为了解决RDB缺点的

默认AOF持久化是被关闭的。开启AOF持久化则需要修改配置文件 redis.conf 中 appendonly  false修改成 appendonly yes

持久化文件名配置 appendfilename "appendonly.aof",持久化文件位置和上面RDB配置一样

redis AOF持久化机制什么时候触发?

no: 表示等操作系统进行数据缓存同步到磁盘 (速度快,持久化没保证)

always: 同步持久化,每次发生数据变更时,立即记录到磁盘(速度慢,安全)

everysec: 表示每秒同步一次(默认值,速度很快,但是可能会丢失一秒以内的数据)

redis.conf配置文件配置AOF

原理:主进程把持久化命令写入到缓冲区,缓冲区定时生成持久化文件 不需要创建子进程,缓冲区默认1M大小

配置缓冲区大小

AOF持久化重写机制

为什么会有重写机制呢?因为再redis进行持久化时,会将命令字符串写入文件当中。假如数据量过大,磁盘被写满了。就会持久化失败所以就有了重写机制。就是给文件瘦身的方案,把没用不需要的字符串删除。

重写是根据内存数据生成新的AOF文件。

什么时候出发AOF重写?

redis.conf配置文件中配置 

auto-aof-rewrite-min-size 64MB

默认配置是当我们的aof文件达到了64M后,进行重写。具体需求大小根据公司业务大小配置。(一般小公司都是5个G以上配置。。)

配置重写增长率

auto-aof - rewri te-percentage 100
# 100 表示增长率 1.0 比如当文件写满64M后执行了 重写机制瘦身成 40M
# 这里配置就是 重写40M + 40M*1.0 = 80M后自动重写,下一次重写是 80M + 80M*1.0 = 160M 才开始继续重# 写,依次往后类推

注意:重写机制是redis创建一个子进程进行重写,如果配置太小,数据量过大。会频繁的进行重写。会对机器的性能造成很大的影响。

小提示:当AOF文件增长到一定大小的时候 可以调用 bgrewriteaof 命令 对文件进行手动重写

 

redis 混合持久化机制

redis在4.0版本之后提供了混合持久化机制(RDB + AOF)对重写的优化,重写的数据是以rdb文件内容保存的,重写之后添加的数据是以aof文件内容方式保存的。

因为rdb保存数据是以redis中自定义的格式保存的,占用磁盘空间特别小。重写就使用rdb方式保存,重写之后修改的数据是以命令字符串(aof)方式保存的。

只要开启了AOF就以AOF为准 。。

 

RDB  优点:适合数据恢复  (基于内存数据生成的快照) 缺点: 数据丢失多 

AOF  优点:保证数据安全  缺点: 恢复数据慢 (一个命令一个命令执行的)

 

提示:如果持久化文件损坏,redis提供的有持久化文件修复工具

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值