一、介绍
Redis可以当做缓存和数据库来使用。
(1)作缓存:数据可以丢,要求速度快。
(2)作数据库:数据绝对不能丢,不仅要速度+更重要的是数据持久化。而内存里的数据掉电易失
从存储层Redis数据持久化来看,分为两块:
快照/副本——RDB
日志——AOF
二、RDB
RDB最重要的就是时点,它会在每次时点到的时候将数据存储到磁盘。触发RDB存储数据有以下两种方式:
-
save:前台触发,同时阻塞。(比如关机维护时使用)
-
bgsave:后端异步非阻塞的方式把数据落到磁盘;会调用fork创建子进程。
-
Redis的配置文件中可以设置bgsave的规则(使用的是save标识,但触发的是bgsave)。
配置文件:/etc/redis/6379.conf
============SNAPSHOTTING============
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb(RDB文件名)
dir /var/lib/redis/6379(RDB文件存储位置)
- RDB方式存储数据有以下弊端:
(1)不支持拉链(永远只有一个dump.rdb文件)
(2)丢数据相对多一些(时点与时点之间的数据容易丢失)
- 优点:类似于java中的序列化,恢复速度相对快
为了解决RDB的弊端,产生了AOF。
fork:内核机制,速度快,空间小。采用copy on write机制(创建子进程并不发生复制)往磁盘写数据时才发生复制。
三、AOF(append only file)
AOF:将Redis的写操作记录到文件中。
-
丢数据少
-
RDB和AOF可以同时开启(如果开启了AOF只会用AOF恢复数据)。4.0以后AOF中包含了RDB全量,也就是AOF中前面部分是RDB,然后再追加增量(追加新的写操作)。
-
弊端:体量无限变大,导致恢复变慢
-
优点:丢数据少
-
那么如何设计一个方案,让AOF足够小
4.0以前:重写,删除抵消的命令,合并重复的命令,最终也是一个纯指令的日志文件。恢复成本还是相对较高。
4.0以后:重写,先将老的数据RDB到AOF文件中,将增量的以指令的方式Append到AOF中(也就是AOF里包含RDB和增量的日志信息)。此时AOF是混合体,利用了RDB的快和AOF的丢数据少。混合体的AOF文件以REDIS开头。aof-use-rdb-preamble yes
-
在AOF写操作会触发IO时,有三个级别可以调
appendfsync no
appendfsync always
appendfsync everysec
# appendfsync always(每一次操作都把buffer的数据写到磁盘,此时数据肯定是最可靠的,最多丢失一条数据)
appendfsync everysec(Redis每秒调用一次flush,即每秒执行一次从buffer到磁盘的写操作;丢失的数据最大比一个buffer小一丢丢,但这是一种最坏的概率。所以是always和no的一个折中)
# appendfsync no(Linux kernel fd的buffer满了,自动往磁盘刷数据,不手动执行,此时可能会丢失一个buffer大小的数据)
相关的配置:
============APPEND ONLY MODE============
appendonly no(默认是关闭AOF)
appendfilename “appendonly.aof”(AOF文件名称,路径和RDB相同)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
四、实操
vi /etc/redis/6381.conf
1、修改 daemonize yes 为 daemonize no(让Redis在前台阻塞执行)
2、注释掉 logfile /var/log/redis_6381.log(将日志输出到前台)
3、修改 appendonly no 为 appendonly yes(追加aof文件)
4、aof-use-rdb-preamble yes 改为 no(验证老版本AOF文件内容)
5、启动redis:redis-server /etc/redis/6381.conf,此时可以把/var/lib/redis/6381里面的日志信息清空rm -rf ./*
6、redis-cli -p 6381:做一些操作set k1 hello
7、查看/var/lib/redis/6381下的AOF文件信息
8、bgsave 把数据落到磁盘,产生rdb文件
9、redis-check-rdb dump.rdb 如果rdb文件出错,会告诉出错信息
10、set k1 a set k1 b set k1 c
11、BGREWRITEAOF 会删除抵消的命令,合并重复的命令
验证新版Redis的AOF文件
1、Ctrl+c 停掉启动的6381Redis
2、rm -rf ./* 删除/var/lib/redis/6381下的文件
3、vi /etc/redis/6381.conf 修改aof-use-rdb-preamble no为yes
4、redis-server /etc/redis/6381.conf 启动Redis
5、redis-cli -p 6381 set k1 a set k1 b set k1 c
6、BGREWRITEAOF 将老的数据RDB移到AOF文件中,将增量的以指令的方式Append到AOF中,会删除抵消的命令,合并重复的命令
7、var/lib/redis/6381 vi appendonly.aof 此时AOF文件前面会有REDIS标识
8、set k1 w set k1 m
9、var/lib/redis/6381 vi appendonly.aof 此时前一步的操作会以明文的方式追加到AOF文件后面
10、bgsave (把数据落到磁盘,产生rdb文件)
11、BGREWRITEAOF (将老的数据RDB移到AOF文件中,将增量的以指令的方式Append到AOF中,删除抵消的命令,合并重复的命令)