Redis6.0 解压版的数据持久化操作【RDB+AOF】
- [Redis6.0 解压版的数据持久化操作【RDB+AOF】](#Redis6.0 解压版的数据持久化操作【RDB+AOF】)
Redis6.0 解压版的数据持久化操作【RDB+AOF】
记录下redis的数据持久化操作,主要就是修改配置文件 redis.windows.conf
需求:
解压版 Redis 默认是内存数据库,重启丢数据。
要持久化,必须:
1、修改 redis.windows.conf 配置 RDB 或 AOF
2、启动 Redis 时 指定配置文件
3、保存数据后重启测试
操作
启动脚本
cd /d <路径> = 切换盘符 + 切换目录,
如果不加 /d,执行 cd E:\install\Redis6.0\redis-6.0.14 时:
如果当前在 C:盘,目录不会切换到 E:盘,只会报错或停留在 C:盘
用txt写好后,改成 bat 即可
@echo off
cd /d E:\install\Redis6.0\redis-6.0.14
redis-server.exe redis.windows.conf
pause
注意点:脚本加上这个 redis.windows.conf ,在redis 启动时才会去加载这个配置文件,里面我们修改的配置才会生效。
RDB 持久化
修改配置
Redis 的持久化数据主要是 RDB 文件 或 AOF 文件,它们都是普通文件,默认存放在 Redis 的工作目录(dir 配置项)
在 Redis 中,RDB(快照持久化) 默认就是开启的,只要配置文件中有 save 指令即可。
RDB 持久化会在指定时间和写入次数条件下,把内存数据快照写入磁盘。
# 这个就是配置文件里面的 save 指令
save 900 1
save 300 10
save 60 10000

配置文件 redis.windows.conf 中,指定启动时去 bin 目录找 dump.rdb 文件
dir ./
dbfilename dump.rdb

注意事项
注意:【Redis 会每隔 900 秒检查过去 900 秒内是否有修改,Redis 并不会在修改后马上写入,而是等到 900 秒这个时间窗口到期才触发】
起因是后面我发现新增数据后,重启还是没有数据,需要输入 【save】这个命令强制保存,再重启,数据才会存在。
因此,因为 RDB 不满足我的持久化需求,所以我打算把 AOF 也开启,AOF 和 RDB 是能同时开启的。
AOF 持久化
修改配置
# 在配置文件中,开启 AOF 持久化
appendonly yes
# 开启 AOF 持久化后,数据是存在这个 "appendonly.aof" 文件里面的
appendfilename "appendonly.aof"
# 添加 AOF 的持久化策略:
# always - 每次写操作都刷盘(最安全,但性能差)
# everysec - 每秒刷盘一次(推荐)
# no - 不自动刷盘(不安全)
# appendfsync always
appendfsync everysec
# appendfsync no

注意事项:
问题: 刚开始数据是存在rdb,然后用 save 保存,重启后数据已经持久化了,后面开启了 aof,重启后发现数据又没了。
解答: RDB 和 AOF 同时存在时的数据恢复逻辑,Redis 官方规定:
1、Redis 启动时,如果同时存在 RDB 文件 (dump.rdb) 和 AOF 文件 (appendonly.aof):
--->默认 优先使用 AOF 文件 来恢复数据,如果 AOF 文件不存在或损坏,则使用 RDB 文件
2、当我之前只用 RDB 持久化:
--->save 会把当前内存快照写入 dump.rdb,这个时候数据在 dump.rdb 中
3、后来我又开启了 AOF:
--->Redis 会生成一个新的 appendonly.aof 文件,AOF 文件初始内容可能为空(或者只包含 RDB 启动后的写命令),启动 Redis 时,会根据 AOF 文件恢复数据,所以发现没有之前 RDB 的 key → 看起来"数据丢了"
解决:
同时使用 RDB + AOF,确保不会丢数据,需要:
1、先开启 AOF,再手动把 RDB 数据导入 AOF:
--->方法:把 Redis 停掉,启动 RDB 恢复数据,然后用 BGREWRITEAOF 命令生成新的 AOF 文件,AOF 会把内存里所有 key 写入。
客户端启动后,输入这个命令让 AOF 文件包含当前所有数据
BGREWRITEAOF
2、以后就以 AOF 为主:
--->RDB 仍可做周期性备份,AOF 确保数据更安全
BGREWRITEAOF命令的使用场景:
内存中已有数据,后面再开启 AOF,但 AOF 文件还没包含前面这些数据 → 执行 BGREWRITEAOF 会把现有内存数据写入 AOF