Redis的一大重要特征就是支持持久化。
Redis提供了两种不同的持久化方式:RDB和AOF。 RDB持久化可以在指定的时间间隔内生成数据集的快照。由于是定期的生成数据集的快照,所以,如果服务器出现异常停止的时候,那可能就会造成上一次备份后面的数据没有被保存下来。
AOF持久化以纯文本的方式记录了所有的操作命令。aof支持不同的fsync策略,可以选择每秒fsync,默认是每秒。如果在写的时候出现宕机,也可以通过redis-check-aof工具来修复aof备份文件。
这两种持久化方式也可以同时使用。
持久化配置
RDB方式:在默认情况下,Redis将数据库快照保存在名字为dump.rdb的二进制文件中,也可以通过配置文件配置。
可以通过配置文件来决定RDB保存的条件,也可以通过SAVE或者BGSAVE命令来显示的执行保存操作。
例如:save 60 1000的意思是 60秒内至少有1000个键被改动过的话就自动保存一次数据集。
默认情况下是启用RDB方式持久化的。
save 900 1
save 300 10
save 60 10000
默认情况下,没900秒内有一个key被改动就保存,没300秒内有10个key被改动就保存,每60秒内有1万个key被改动就保存。
dbfilename dump.rdb:指定了保存的文件名。
dir ./:指定了保存的路径为当前目录,更改为/usr/local/redis
AOF方式:aof方式的启动只需要配置一个appendonly yes的选项就可以。
aof支持下面几种持久化策略:
1、每次有新命令就执行一次fsync
2、没秒执行一次fsync(默认)
3、从不fsync。
appendonly no:默认情况下没有开启,修改为yes就是开启。
appendfilename "appendonly.aof":默认的持久化文件名称。
# appendfsync always
appendfsync everysec:默认开启这个,每秒fsync一次。
# appendfsync no
RDB方式测试
[[email protected] 13:14 /usr/local/redis]# ll 总用量 276 -rw-rw-r--. 1 root root 127778 7月 24 22:58 00-RELEASENOTES -rw-rw-r--. 1 root root 53 7月 24 22:58 BUGS -rw-rw-r--. 1 root root 1815 7月 24 22:58 CONTRIBUTING -rw-rw-r--. 1 root root 1487 7月 24 22:58 COPYING drwxrwxr-x. 6 root root 4096 8月 15 19:35 deps -rw-rw-r--. 1 root root 11 7月 24 22:58 INSTALL -rw-rw-r--. 1 root root 151 7月 24 22:58 Makefile -rw-rw-r--. 1 root root 4223 7月 24 22:58 MANIFESTO -rw-rw-r--. 1 root root 20530 7月 24 22:58 README.md -rw-rw-r--. 1 root root 57765 9月 3 11:32 redis.conf -rwxrwxr-x. 1 root root 271 7月 24 22:58 runtest -rwxrwxr-x. 1 root root 280 7月 24 22:58 runtest-cluster -rwxrwxr-x. 1 root root 281 7月 24 22:58 runtest-sentinel -rw-rw-r--. 1 root root 7606 7月 24 22:58 sentinel.conf drwxrwxr-x. 3 root root 4096 9月 9 12:55 src drwxrwxr-x. 10 root root 4096 7月 24 22:58 tests drwxrwxr-x. 8 root root 4096 7月 24 22:58 utils [[email protected] 13:14 /usr/local/redis]# redis-cli 127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> shutdown save not connected> exit [[email protected] 13:18 /usr/local/redis]# ll 总用量 280 -rw-rw-r--. 1 root root 127778 7月 24 22:58 00-RELEASENOTES -rw-rw-r--. 1 root root 53 7月 24 22:58 BUGS -rw-rw-r--. 1 root root 1815 7月 24 22:58 CONTRIBUTING -rw-rw-r--. 1 root root 1487 7月 24 22:58 COPYING drwxrwxr-x. 6 root root 4096 8月 15 19:35 deps -rw-r--r--. 1 root root 177 9月 9 13:18 dump.rdb -rw-rw-r--. 1 root root 11 7月 24 22:58 INSTALL -rw-rw-r--. 1 root root 151 7月 24 22:58 Makefile -rw-rw-r--. 1 root root 4223 7月 24 22:58 MANIFESTO -rw-rw-r--. 1 root root 20530 7月 24 22:58 README.md -rw-rw-r--. 1 root root 57765 9月 3 11:32 redis.conf -rwxrwxr-x. 1 root root 271 7月 24 22:58 runtest -rwxrwxr-x. 1 root root 280 7月 24 22:58 runtest-cluster -rwxrwxr-x. 1 root root 281 7月 24 22:58 runtest-sentinel -rw-rw-r--. 1 root root 7606 7月 24 22:58 sentinel.conf drwxrwxr-x. 3 root root 4096 9月 9 12:55 src drwxrwxr-x. 10 root root 4096 7月 24 22:58 tests drwxrwxr-x. 8 root root 4096 7月 24 22:58 utils [[email protected] 13:18 /usr/local/redis]#
发现,已经有dump.rdb文件了。
我们重新启动服务器查看:
[[email protected] 13:19 /usr/local/redis]# service redis start Starting Redis server... 3925:C 09 Sep 13:20:03.909 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3925:C 09 Sep 13:20:03.910 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3925, just started 3925:C 09 Sep 13:20:03.910 # Configuration loaded [[email protected] 13:20 /usr/local/redis]# redis-cli 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379>
可以看到,此时的keys还是存在的。
但是,如果我们把dump文件移动到别的地方呢?
[[email protected] 13:21 /usr/local/redis]# service redis start Starting Redis server... 3948:C 09 Sep 13:22:03.371 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3948:C 09 Sep 13:22:03.371 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3948, just started 3948:C 09 Sep 13:22:03.371 # Configuration loaded [[email protected] 13:22 /usr/local/redis]# redis-cli 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379>
发现,keys又不存在了,如果我们把dump文件在拿回来,又可以继续读取到。这就可以用来实现备份和恢复了。
AOF方式测试
需要注意的是,当rdb方式和aof方式同时开启的时候,服务器重启会优先读取aof的文件。
修改配置文件如下:
appendonly yes
[[email protected] 13:32 /usr/local/redis]# redis-cli 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> set name lisi OK 127.0.0.1:6379> set name wangwu OK 127.0.0.1:6379> get name "wangwu" 127.0.0.1:6379> shutdown not connected> exit [[email protected] 13:34 /usr/local/redis]# ll 总用量 284 -rw-rw-r--. 1 root root 127778 7月 24 22:58 00-RELEASENOTES -rw-r--r--. 1 root root 91 9月 9 13:33 appendonly.aof -rw-rw-r--. 1 root root 53 7月 24 22:58 BUGS -rw-rw-r--. 1 root root 1815 7月 24 22:58 CONTRIBUTING -rw-rw-r--. 1 root root 1487 7月 24 22:58 COPYING drwxrwxr-x. 6 root root 4096 8月 15 19:35 deps -rw-r--r--. 1 root root 175 9月 9 13:34 dump.rdb -rw-rw-r--. 1 root root 11 7月 24 22:58 INSTALL -rw-rw-r--. 1 root root 151 7月 24 22:58 Makefile -rw-rw-r--. 1 root root 4223 7月 24 22:58 MANIFESTO -rw-rw-r--. 1 root root 20530 7月 24 22:58 README.md -rw-rw-r--. 1 root root 57765 9月 3 11:32 redis.conf -rwxrwxr-x. 1 root root 271 7月 24 22:58 runtest -rwxrwxr-x. 1 root root 280 7月 24 22:58 runtest-cluster -rwxrwxr-x. 1 root root 281 7月 24 22:58 runtest-sentinel -rw-rw-r--. 1 root root 7606 7月 24 22:58 sentinel.conf drwxrwxr-x. 3 root root 4096 9月 9 12:55 src drwxrwxr-x. 10 root root 4096 7月 24 22:58 tests drwxrwxr-x. 8 root root 4096 7月 24 22:58 utils [[email protected] 13:34 /usr/local/redis]#
查看appendonly.aof的文件内容:
[[email protected] 13:34 /usr/local/redis]# cat appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 name $4 lisi *3 $3 set $4 name $6 wangwu [[email protected] 13:35 /usr/local/redis]#
重新启动服务器查看:
[[email protected] 13:36 /usr/local/redis]# redis-cli 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> get name "wangwu" 127.0.0.1:6379>
这就完成了redis的持久化配置了 。