前言
笔者目前在学习redis数据库,以此文章记录一些概念。
Redis持久化
Redis是一个支持持久化的内存数据库,也就是说Redis经常需要将内存中的数据同步到硬盘中来保证持久化。那么,Redis提供了两种持久化方式:
- (默认)Snapshotting — 快照
- Append-Only File — AOF
Snapshotting (RDB)
Redis会在某一时间点或满足某些要求时把自己内存中存储的数据默认以dump.rdb命名的镜像文件(二进制文件)的形式保存在硬盘中。我们可以在redis.cof中指定dump.rdb的存储位置。
运行原理:
- Redis通过fork产生子进程
- 父进程继续处理客户端请求
- 子进程写完后,用临时文件替换原来的快照文件,然后子进程退出。
ps:如果业务要求数据完整性或者是一致性不是那么高的话,可以考虑使用RDB
触发时机
指定时间间隔
save、bgsave指令
停止redis服务
flushall指令
缺点
在A时间节点备份了镜像文件之后,在B时间节点之前系统宕机,则A与B时间节点之间的数据无法恢复。
AOF
redis以AOF(日志重写)方式从数据库中读取所有的写操作记录在日志中,通过读取日志的方式来恢复数据
注意:不是基于上一次AOF文件进行重写,而是基于当前redis数据库的数据进行重写
配置:
把appendonly 后面跟yes即打开aof机制
appendfilename后面的双引号里就是日志名字
appendfsync 后面跟的三个条件分别是:
- always:每次数据变动时 (执行大量写操作时性能差,但是安全性高,毕竟每一次变动记录一次)
- everysec:每一秒同步记录一次(系统默认)
- no :不tongue
RDB与AOF切换过程中的一个坑
由于redis数据库默认不开启AOF,开启的是RDB,那么当数据库有数据时,在配置文件里把RDB关掉,去开启AOF后,数据全部丢失。
原因:
RDB机制下,数据以二进制的镜像文件里的数据为主,切换到AOF之后,数据以日志文件里的记录为主。所以造成了数据丢失的情况。
解决方案:
使用热切换:
redis中使用命令:
config set appendonly yes
config set save “”