Redis-关于数据持久化

概述

redis是一个缓存数据库,数据通常存放在内存中,以此做到快速读写功能。这样做的弊端就是每次机器重启或者掉线数据都会消失。通常为了解决内存数据再下次重启消失问题,主要方式就是把数据持久化到磁盘中,每次启动的时候就是磁盘数据载入内存,redis也是支持这种模式。

持久化方式

redis持久化数据到磁盘主要有两种方式:RDB和AOF。RDB方式是根据策略(配置文件)定时把数据持久化到磁盘;AOF方式是每次执行写命令的时候把该命令记录下来,启动的时候执行记录下来的命令。两种方式可以单独或者结合使用。

一、RDB

RDB方式是靠快照的形式对数据持久化(快照:数据存储的某一时候的记录),当符合某种规则(命令或者配置文件)把全量数据记录下来保存在磁盘中。快照原理:redis快照默认是放在当前进程的工作目录dump.rdb文件中,可以通过配置文件的dbfilename和dir指定文件的名称和位置。

1、根据配置文件进行快照

配置文件在redis.windows.conf中找到如下信息:

命令的格式:save 毫秒数 发生改变的key数,每行一个规则,多个规则是“或者”关系,只要条件满足就会触发快照

(save 900 1:在900毫秒内大于一个key发生改变触发快照)

2、用户手动执行SAVE、BGSAVE命令

SAVE是一种阻塞快照方式,当执行这个命令的时候,redis不允许对外提供服务(阻塞所有的客户端);

BGSAVE是一种不堵塞快照方式,当执行这个命令的时候,redis继续对外提供服务,后台执行快照操作。当发送BGSAVE命令时,会立刻返回OK标志(不确定执行完成),要确定是否执行完成再发送LASTSAVE,返回最后一次的unix时间戳。

3、手动执行FLUSHALL命令

执行flushall命令的时候,redis会清空所有数据。在清空数据的时候,会触发配置文件的设定,进行快照,如果配置文件没有设置,则不会触发快照

4、执行复制replication

redis是master-slave(主从模式)下,master同步数据到slave的时候会触发快照。

快照过程:

(1)redis使用fork函数复制一份当前进程(父进程)的副本(子进程)

(2)父进程继续执行客户端的请求,子进程开始讲内存数据写入磁盘的临时文件

(3)当子进程写完所有的数据,用临时文件代替掉rdb文件

注意:fork函数发生的时候,父进程与子进程共享一个内存数据,当父进程需要修改某片数据的时候,操作系统会将该片数据复制一份保证不影响子进程,所以RDB保存的是执行fork那可以的数据,RDB理论上是会存在丢失数据的情况(fork之后的数据)

二、AOF

使用reids存储非临时数据时,通常都是开启AOF方式持久化来减低进程终止导致的数据丢失,AOF可以将redis每一天执行命令都记录下来。这过程会比较消耗性能,但是可以通过使用性能高的硬盘提升。AOF文件是可识别的纯文本文件,一个个标准的redis操作命令

1、开启AOF,默认redis是不开启的,在配置文件redis.windows.conf设置为appendonly yes开启

开启AOF后,redis每一条命令都会记录到磁盘的AOF文件中,AOF默认是appendonly.aof,可以通过appendfilename和dir指定文件名称和路径。

2、AOF文件重写

redis命令写入AOF文件,是每一条命令都写入,无论这条命令是否是无效的(比如一个值被N次操作,会几率N条命令),这样导致文件会很大。AOF文件重写是重新生成一份AOF文件,新的文件里一条记录只有一条操作。重写过程与RDB过程类型:fork复制一个子进程,遍历数据,写入新的AOF临时文件,同时外部的写操作日志依旧写入旧的AOF文件,同时也会把写日志写到内存缓存中,当重写操作完成写,内存缓存中的日志会一次性写入临时文件中;最后调用原子性操作rename命令用新文件代替旧文件。

可以使用命令:BGREWRITEAOF(bgrewriteaof)手动触发重写

自动触发在配置文件redis.windows.conf设置

auto-aof-rewrite-percentage 100 :超过上次重写文件大小的百分之几触发,如果上次没重写则默认启动文件大小

auto-aof-rewrite-min-size 64mb:当文件超过多大触发重写操作

3、同步磁盘数据

虽然AOF会记录每一次命令,但是操作系统本身的磁盘缓存机制,AOF文件并没有真正写入磁盘中,通常是操作系统每隔30s把缓存数据同步到磁盘中,我们可以在redis.windows.conf设置磁盘同步的频率。

# appendfsync always :AFO每写入一条记录,都会执行同步到磁盘操作,最安全速度最慢

appendfsync everysec:每一秒执行一次同步操作,默认这个,当这次fsync(同步)调用超过一秒的时候,下一次fsync会延迟一秒调用。

# appendfsync no:不主动同步操作,最不安全

RDB与AOF方式可以相互补充。

三、区别

参考地址:https://www.cnblogs.com/xiaoxi/p/7065328.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值