Redis 数据持久化
Redis 数据持久化
我在这里只记录点基本内容,不会写太深入的内容
两种持久化方式:
- RDB 当前的数据:RDBFile
- 操作的命令:AOFFile
RDB
RDB 是 redis 默认的持久化,又称为快照
看redis的配置文件,redis.conf
save 900 1 # 900 秒操作大于等于 1 次,就会使用一次 RDB
save 300 10 # 300 秒操作大于等于 10 次,就会使用一次 RDB
save 60 10000 # 60 秒操作大于等于 10000 次,就会使用一次 RDB
RDB 命令
save
命令:将内存数据镜像保存为 rdb 文件,由于 redis 是单线程模型,期间会阻塞 redis 服务进程,redis 服务不再处理任何指令,直到 rdb 文件创建完成为止bgsave
命令:父进程启动子进程,由子进程将内存保存在硬盘文件,期间不会影响其它的指令操作
通过redis配置,自动触发 bgsave 命令的原理:
- redis有一个周期性操作函数,默认每隔 100ms 执行一次(可改源码),它的其中一项工作就是检查自动触发 bgsave 命令的条件是否成立
- 计数器记录了上一次成功的持久化后,redis进行了多少次写操作,其值在每次写操作之后都加1,在成功完成持久化后清零
缺点:
- 持久化时比较耗时
- 持久化时,新写入redis的数据可能丢失
优点:
- 还原数据时很块
AOF
AOF 称为日志追加,会保存redis每次操作的命令
redis.conf 文件
appendonly yes
三种追加方式:
appendfsync always
:只要有读写。安全性高,性能低appendfsync everysec
:1秒钟的周期。安全性比较高,性能比较高appendfsync no
:等业务不繁忙的时候。安全性低,性能高、这种操作最不可靠
尽量使用 appendfsync everysec
文件中的命令保存的格式
*第一个命令的参数个数
$第一个命令的第一个参数的长度
第一个命令的第一个参数
$第一个命令的第二个参数的长度
第一个命令的第二个参数
*第二个命令的参数个数
$第二个命令的第一个参数的长度
第二个命令的第一个参数
$第二个命令的第二个参数的长度
第二个命令的第二个参数
举例:
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$8
zhangsan
就是保存了两个命令
select 0
set name zhangsan
可以修改文件的数据,从而影响redis的读取
重写
对同一个 key 的操作会导致 AOF 文件变得很大,这时候就需要重写,重写就是把大文件改成小文件
比如
key1 value1
key1 value2
key1 value3
可以重写成
key1 value1,value2,value3
缺点:
- 持久化文件体积比RDB大
- 还原比RDB慢,不适合大数据迁移
优点:
- 持久化文件可读性好
- 数据的安全性比RDB高
综合方案
redis.conf 文件,混合持久化模式
aof-use-rdb-preamble yes
数据量大时,将AOF变成RDB