八.持久化
在运行过程中,redis是将数据保存在内存中
如果没有使用持久化,当服务器关闭之后,内存中的数据会被清空
为了让这些数据在服务器重启之后依然可用
redis提供了两种持久化方式
1.RDB
1-1 什么是RDB
Redis Database
将数据的快照以二进制的方式保存在硬盘中
在指定的时间间隔内,将内存中的数据快照保存到磁盘中
后面的数据快照会将前面锁保留的数据快照覆盖
RDB文件是一个以
*.rdb
结尾的文件,默认为dump.rdb
当服务器重启之后,自动读取所保存的快照文件
将快照文件中的数据恢复到内存中
如果在启动之后,RDB文件被删除,则启动之后,数据库中数据全部丢失
1-2 快照文件的保存时间间隔
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
#在900秒范围内,发生了一次变化
save 900 1
#在300秒范围内,发生了10次变化
save 300 10
#在60秒范围内,发生了10000次变化
save 60 10000
1-3 如何恢复数据
根据配置文件中所配置的rdb文件名
# The filename where to dump the DB
#配置rdb文件是谁,默认为dump.rdb
dbfilename dump.rdb
将对应的rdb文件存放到src目录下
当服务器启动时,会自动读取配置文件中所指定的rdb文件
将该文件中的数据恢复到数据库中
1-4 如何生成快照文件
- 自动
- 根据在配置文件中所配置的时间间隔自动生成rdb文件
- 手动
- 通过调用命令,立刻生成当前的快照
1-5 命令
- save
- 直接在当前进程中调用save命令
- 此时会阻塞当前的主进程
- 阻塞一直到数据保存完成为止
- 在主进程阻塞的期间,服务器不能处理任何一个客户端的请求
- 是一个同步的操作
- 优点
- 不会额外的消耗内存
- 缺点
- 阻塞主进程,阻塞客户端命令,执行效率低
- bgsave
- fork出一个子进程
- 由子进程进行调用保存命令,生成对应的快照文件
- 保存完成之后,会发送信号告诉主进程保存已经完成
- 由于保存操作是在子进程中执行的
- 因此它不会阻塞到主进程的操作
- 优点:
- 不会阻塞到主进程的任何操作
- 缺点:
- 由于子进程复制了一个与主进程完全一致的进程
- 那么会额外的消耗大量的内容
- 服务器的压力会变的很大
- fork
- 其实就是一个复制的操作
- fork的作用就是复制一份与当前一模一样的进程作为当前的子进程
- 子进程中所有的信息都与主进程完全的一致
- 相当的消耗内存
1-6 优缺点
- 优点
- 适合大规模的数据的恢复
- 对于数据的完整性与一致性的要求没有那么严格
- 缺点
- 在一定的时间间隔内会做一次备份
- 该备份会将原有文件替换调用
- 如果在替换过程中出现了意外
- 会导致数据的丢失
- 如果进行fork
- 会将内存中国的数据拷贝一份
- 此时非常的消耗内存
- 增大服务器的压力
- 在一定的时间间隔内会做一次备份
2.AOF
2-1 什么是AOF
以文本的方式,将所有对于数据执行的写入操作的命令记录下来
将其记录到对应的AOF文件中
以此到达保存数据的目录
以日志的形式记录每次执行写入操作的命令
每一次都会在原有的内容基础上追加新的操作
2-2 开启AOF
默认情况下,redis使用的RDB方式进行持久化
如何开启AOF
打开配置文件,找到APPEND ONLY MODE相关配置
-
appendonly
- 表示使用启用AOF进行持久化
- 默认值为no表示不起用
- 将其改为yes表示启用
-
appendfilename
- 配置AOF持久化的文件名
- 默认为:
appendonly.aof
-
appendfsync
- 配置AOF的保存模式,值有三种
- always
- 表示每一次运行写入命令都会将该命令写入到文件中
- 每执行一个命令,保存一次
- everysec
- 默认值
- 每一秒同步一次数据
- 保存操作是由子进程执行
- no
- 本身自己是不执行保存操作
- 等操作系统做数据缓存的同时进行同步的保存
- 会阻塞主进程
2-3 去除冗余文件
- auto-aof-rewrite-percentage 100
- 当目前的AOF文件超过了上次重写的文件的百分之多少的时候,会进行重写
- auto-aof-rewrite-min-size 64mb
- 限制了允许重写的AOF的文件的最小需要多大
2-4 优缺点
- 优点
- AOF保存文件的操作是一个追加操作
- 不存在数据丢失的风险
- 缺点
- AOF文件中存在着大量的冗余数据
- 非常的消耗内存
- 且运行效率是远远的低于RDB的