持久化
- redis在作为缓存和数据库的区别在于,缓存一般都是有期限的热数据,非全量数据,数据可以丢失,追求的是急速。
- redis作为数据库的时候,数据是绝对不能丢的。数据存在内存当中就会产生 掉电易失 的问题。所以redis作为数据库,追求的是 速度 + 持久性。
持久化技术
快照 / 副本
日志
父进程与子进程的关系
linux管道命令
- 将前一个命令的输出作为后一个命令的输入
- 需要注意,管道符前的指令必须有正确的输出,管道符后必须可以处理前面的正确输出结果,不能处理前面的错误输出
- 管道会触发两个子进程执行”|”两边的程序,重定向是在一个进程内执行
linux中,export的环境变量,子进程的修改不会破坏父进程,父进程的修改也不会破坏子进程。
redis有两种持久化数据的方案,分别为RDB(Redis DataBase)和AOF(Append Only File)
RDB
- RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。RDB具有时点性,定点保存数据。
- 在新版本里也可以使用bgsave指令生成dump.rdb文件。
- 利用fork()函数创造子进程,类似于Copy-on-write的操作,父进程进行修改,子进程负责持久化,本质:产生新数据进行写入新的内存,然后移动父进程的指针,子进程可以看作虚拟内存,指针指向相应的数据内存
- fork()调用创建的子进程可以看到父进程的数据,copy on write机制让父 / 子进程数据隔离。
rdb的触发
rdb的触发分为两种
- 手动触发:
手动触发又分为save 命令阻塞触发 和bgsave 命令非阻塞触发。
save会触发前台阻塞。主要应用在 服务器 关机维护。
bgsave会触发fork()命令创建子进程异步写入磁盘。 - 配置文件设置规则触发:
在conf配置文件中找到 SNAPSHOTTING 模块,
save 900 1
save 300 10
save 60 10000
这里的save表示的是触发bgsave命令,分别代表 900 秒 操作数达到1次,300 秒操作数达到 10 次,60 秒操作数达到 10000 次 触发bgsave。
关于rdb在conf文件中的一切其他配置:
rdbcompression yes:是否开启压缩。
rdbchecksum yes:开启在rdb文件后面写一个校验位。
dbfilename dump.rdb:rdb文件的名称。
dir /var/lib/redis/6379:rdb文件所在的目录。
rdb的优点与弊端
缺点:
- 不支持拉链,只能有一个dump.rdb文件,需要运维人员定制定时策略,比如每天把最后一个dump.rdb重命名或者迁移到别的机器上并设置日期时间。
- 丢失数据相对多一些,时点与时点之间数据容易丢失。比如8点得到一个rdb,9点要落一个rdb,突然服务器挂了。
优点:
- 类似于java的序列化,直接数据状态二进制,回复速度相对快。
AOF(ppend only file)
- AOF :Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。
- Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
- 并且在redis中,aof和rdb可以同时开启,但是如果开启了aof就只会使用aof恢复数据。因为aof恢复数据的完整性高。
- 在4.0版本以后aof中包含rdb全量,增加记录新的写操作。这么做的好处就是 写操作日志 相对少一些, 执行aof文件恢复数据时,先使用rdb进行恢复,再使用写操作日志,恢复速度相对快一些。
重写
- redis4.0以前:可以触发rewrite机制,就是删除抵消的命令和整合重复的命令。
例1 :set k1 1,set k1 2,set k1 4这三条命令就可以抵消为set k1 4一条命令,因为set k1 1,set k1 2属于废弃数据,k1的最终值为4。
例2:lpush k1 1,lpush k1 1,lpush k1 1这三条命令可以整合成lpush k1 1 1 1,这样就节省了2个push单次所占用的空间。
最终得到的还是一个纯指令的日志文件。最终得到的还是一个纯指令的日志文件。最终得到的还是一个纯指令的日志文件。
- redis4.0以后:还是触发rewrite机制,不同的是用rdb的方式写入aof文件里面,之后会把增量的指令日志append到aof中。
利用了rdb的快的特点,同时还利用的append丢失少的特点。
最终得到是aof混合体最终得到是aof混合体最终得到是aof混合体
conf文件中aof的配置:
AOF参数配置
APPEND ONLY MODE模块。
appendonly no:aof为默认关闭状态,我们可以更改为appendonly yes开启。
appendfilename "appendonly.aof":默认文件名称。
appendfsync everysec:IO的级别默认为每秒发生一次flush。最多丢失一个buffer的数据。
appendfsync always:IO的级别为每次写都会发生flush。
appendfsync no:IO的级别为redis不主动flush,等待kernel的buffer满了自动flush。最多就是一个buffer的数据。
no-appendfsync-on-rewrite no:在发生rewrite或rdb的时候,不主动调用flush()争抢IO。数据敏感性高就开启为yes。
auto-aof-rewrite-percentage 100:最后一次重写后的体积大小所占比例100%,就会从64变为128。
auto-aof-rewrite-min-size 64mb:aof文件到达64m的时候,自动触发重写。