由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据会丢失,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘上恢复数据。
redis的持久化方式有2种,一种是rdb快照持久化,是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储;另一种是aof日志持久化,是以日志的形式记录服务器锁处理的每一个写、删操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
Rdb快照的配置选项
save 900 1 // 900s内,有1条写入,则产生快照
save 300 1000 //300s内有1000次写入,则产生快照
save 60 10000 //60s内有10000次写入,则产生快照
(这三个选项都屏蔽,则rdb禁用)
stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入?
rdbcompression yes // 导出的rdb文件是否压缩
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径
测试案例:
窗口1
[root@myserver redis]# rm -rf dump.rdb #先删除rdb文件
[root@myserver redis]# /usr/redis/redis-cli
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set site www.phalcon.xyz
OK
新开一个窗口2,执行1w次请求
[root@myserver redis]# ./redis-benchmark -n 10000
...
...
...
====== MSET (10 keys) ======
10000 requests completed in 0.15 seconds
50 parallel clients
3 bytes payload
keep alive: 1
98.68% <= 1 milliseconds
100.00% <= 1 milliseconds
66225.17 requests per second
[root@myserver redis]# ls #生成一个rdb文件
redis-benchmark redis-cli redis.conf redis-server dump.rdb
窗口1
127.0.0.1:6379> set address shanghai #设置一个address
OK
窗口2
[root@myserver redis]# pkill -9 redis 杀掉redis进程
窗口1
[root@myserver redis]# /usr/redis/redis-server /usr/redis/redis.conf 开启redis
[root@myserver redis]# /usr/redis/redis-cli
127.0.0.1:6379> get site
"www.phalcon.xyz"
127.0.0.1:6379> get address #此时address丢失
(nil)
Aof 的配置
appendonly no #是否打开持久化
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快,
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
注: 在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
注: aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.
以解决 aof日志过大的问题.
问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: aof
问: 2种是否可以同时用?
答: 可以,而且推荐这么做
问: 恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行