• 全称 Reids DataBase
– 数据持久化方式之一
– 在指定时间间隔内,将内存中的数据集快照写入硬盘。
– 术语叫 Snapshot 快照。
– 恢复时,将快照文件直接读到内存里。
[root@host53 ~]# cd /var/lib/redis/6379/
[root@host53 6379]# ls
dump.rdb
[root@host53 6379]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@host53 6379]# rm -rf dump.rdb
[root@host53 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host53 6379]# ls
dump.rdb
[root@host53 6379]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> keys *
1) "name"
2) "lover"
3) "age"
备份数据:
把51的数据备份,发送给52
[root@host51 6379]# mkdir /redisbak
[root@host51 6379]# cp /var/lib/redis/6379/dump.rdb /redisbak/
[root@host51 6379]# /etc/init.d/redis_6379 stop
[root@host51 6379]# scp /redisbak/dump.rdb root@192.168.4.52:/var/lib/redis/6379/
52的数据跟新51的
[root@host2 6379]# /etc/init.d/redis_6379 stop
[root@host2 6379]# rm -rf dump.rdb
[root@host2 6379]# ls
[root@host2 6379]# /etc/init.d/redis_6379 start
[root@host2 6379]# ls
dump.rdb
[root@host2 6379]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys *
1) "age"
2) "name"
3) "lover"
192.168.4.52:6352>
redis服务关于RDB文件的配置
254 dbfilename "dump.rdb"// 文件名
217 # save "" // 禁用 RDB
数据从内存保存到硬盘的频率
218
219 save 900 1 // 900 秒内且有 1 次修改存盘
220 save 300 10 //300 秒内且有 10 次修改存盘
221 save 60 10000 //60 秒内且有 10000 修改存盘
如果没有停掉服务,就删除dump.rdb
[root@host51 6379]# ls
dump.rdb dump.rdb.bak
[root@host51 6379]# rm -rf dump.rdb
[root@host51 6379]# ls
dump.rdb.bak
[root@host51 6379]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@host51 6379]# ls
dump.rdb dump.rdb.bak
##这跟数据从内存保存到硬盘的频率 有直接的关系 。不管时间到不到,都会把数据存进硬盘
RDB 优点 / 缺点
• RDB 优点
– 高性能的持久化实现, Redis 服务会创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件;整个过程中主进程不做任何 IO 操作,这就确保了极高的性能。
– 如果要进程大规模数据恢复,且对数据完整行要求不是非常高,使用 RDB 比 AOF 更高效。
• RDB 的缺点
– 意外宕机,最后一次持久化的数据会丢失
没有关闭服务就删除数据
192.168.4.51:6351> keys *
1) "name"
2) "age"
3) "lover"
192.168.4.51:6351> FLUSHALL
OK
192.168.4.51:6351> keys *
(empty list or set)
192.168.4.51:6351> quit
[root@host51 6379]# ls
dump.rdb dump.rdb.bak
[root@host51 6379]# rm -rf dump.rdb
[root@host51 6379]# cp dump.rdb.bak dump.rdb
[root@host51 6379]# ls
dump.rdb dump.rdb.bak
[root@host51 6379]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@host51 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 6379]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
192.168.4.51:6351> keys *
(empty list or set)
• 手动立刻存盘
// 阻塞写存盘
– > save
– > bgsave // 不阻塞写存盘
数据存进硬盘把数据存进硬盘:
1.等待硬盘的存盘频率时间
2.save
3.bgsave
4.停止服务,就会自动存盘
• 压缩
– rdbcompression yes | no //默认压缩
• 在存储快照后,使用 crc16 算法做数据校验
– rdbchecksum yes|no
• bgsave 出错停止写操作 , 对数据一致性要求不高设置为 no
– stop-writes-on-bgsave-error yes|no
AOF 介绍
• 只追加操作的文件
– Append Only File
– 记录 redis 服务所有写操作。
– 不断的将新的写操作,追加到文件的末尾。
– 使用 cat 命令可以查看文件内容
[root@host51 6379]# /etc/init.d/redis_6379 stop
[root@host51 6379]# vim /etc/redis/6379.conf
[root@host51 6379]# /etc/init.d/redis_6379 start
673 appendonly yes
677 appendfilename "appendonly.aof"
702 # appendfsync always
703 appendfsync everysec
704 # appendfsync no
744 auto-aof-rewrite-percentage 100
745 auto-aof-rewrite-min-size 64mb
:wq
[root@host51 6379]# /etc/init.d/redis_6379 start
[root@host51 6379]# ls
appendonly.aof dump.rdb dump.rdb.bak
[root@host51 6379]# cat appendonly.aof
[root@host51 6379]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> keys *
(empty list or set)
192.168.4.51:6351> set king tang
OK
192.168.4.51:6351> set king ming
OK
192.168.4.51:6351> keys *
[root@host51 6379]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
模拟数据丢失,恢复数据:
[root@host51 6379]# /etc/init.d/redis_6379 stop
[root@host51 6379]# ls
appendonly.aof appendonly.aof.bak dump.rdb dump.rdb.bak
[root@host51 6379]# rm -rf appendonly.aof
[root@host51 6379]# ls
appendonly.aof.bak dump.rdb dump.rdb.bak
[root@host51 6379]# cp appendonly.aof.bak appendonly.aof
[root@host51 6379]# /etc/init.d/redis_6379 start
[root@host51 6379]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> keys *
1) "king"
192.168.4.51:6351>
修复有问题的AOF文件
[root@host51 6379]# /etc/init.d/redis_6379 stop
[root@host51 6379]# vim appendonly.aof
[root@host51 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 6379]# /etc/init.d/redis_6379 status
Redis is not running
[root@host51 6379]# redis-check-aof --fix appendonly.aof
0x 59: Expected prefix '*', got: 'j'
AOF analyzed: size=108, ok_up_to=89, diff=19
This will shrink the AOF from 108 bytes, with 19 bytes, to 89 bytes
Continue? [y/N]: y
Successfully truncated AOF
[root@host51 6379]# vim appendonly.aof
[root@host51 6379]# /etc/init.d/redis_6379 start
/var/run/redis_6379.pid exists, process is already running or crashed
[root@host51 6379]# rm -rf /var/run/redis_6379.pid exists
[root@host51 6379]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@host51 6379]# /etc/init.d/redis_6379 status
Redis is running (5958)
[root@host51 6379]# ss -ntulp | grep redis
tcp LISTEN 0 128 192.168.4.51:6351 *:* users:(("redis-server",pid=5958,fd=6))
• AOF 文件记录,写操作的三种方式
– appendfsync always // 有新的写操作立即记录,
性能差,完整性好。但是系统开销比较大
– appendfsync everysec // 每秒记录一次,宕机时会 (默认)
丢失 1 秒的数据
– appendfsync no
// 从不记录
• 日志重写 ( 日志文件会不断增大 ) ,何时会触发日志重写?
– redis 会记录上次重写时 AOF 文件的大小,默认配置
是当 aof 文件是上次 rewrite 后大小的 1 倍且文件大于
64M 时触发。
– auto-aof-rewrite-percentage 100
– auto-aof-rewrite-min-size 64mb
-必须两个条件都要成立,才可以进行日志重写
AOF 优点 / 缺点
• RDB 优点
– 可以灵活的设置同步持久化 appendfsync alwayls 或异步持久化 appendfsync verysec
– 宕机时,仅可能丢失 1 秒的数据
• RDB 的缺点
– AOF 文件的体积通常会大于 RDB 文件的体积。执行 fsync 策略时的速度可能会比 RDB 慢。