redis 提供了两种持久化的方式,分别是RDB(Redis Database)和AOF(Append only File)。
- RDB,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上;
- AOF,则是换了一个角度来实现持久化,那就是将 redis 执行过的所有写指令记录下来,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实 RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭 RDB 和 AOF 方式,这样的话,redis 将变成一个纯内存数据库,就像 memcache 一样。
优点- rdb文件体积比较小, 适合备份及传输
- 性能会比 aof 好(aof 需要写入日志到文件中)
- rdb 恢复比 aof 要更快
- 服务器故障时会丢失最后一次备份之后的数据
- Redis 保存rdb时, fork子进程的这个操作期间, Redis服务会停止响应(一般是毫秒级),但如果数据量大且cpu时间紧张,则停止响应的时间可能长达1秒
RDB 方式,是将 redis 某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。
redis 在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。
RBD持久化是把当前数据生成快照存到硬盘的过程,触发RBD持久化过程分为手动触发和自动触发
- 手动触发: bgsave
- 自动触发:(条件不满足的时候,如果执行了shutdown,自动会先执行bgsave,再执行shutdown)
bgsave 命令采用异步方式生成快照,Redis会fork出一个子进程进行RDB文件的生成。
Redis只有在fork子进程时被阻塞,子进程完成快照生成的同时,Redis可以正常工作。
[root@redis1 ~]# redis-cli -h 10.0.0.31 bgsave Background saving started #会自动生成一个rbd文件,这个路径是之前配置的本地数据库的目录,这个可以根据需求进行配置 [root@redis1 ~]# ll /data/redis_cluster/redis_6379/redis_6379.rdb -rw-r--r-- 1 root root 148025 10月 11 14:04 /data/redis_cluster/redis_6379/redis_6379.rdb自动触发
最常见的使用RDB进行持久化的方式,是在配置文件中配置Redis进行快照保存的时机:
save [seconds] [changes]
Redis默认开启RDB快照,默认的RDB策略如下:
save 900 1
save 300 10
save 60 10000
进行配置
[root@redis1 conf]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf ###以守护进程模式启动 daemonize yes ###绑定的主机地址 bind 10.0.0.31 ###监控端口 port 6379 ###pid文件和log文件的保存地址 pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log ###设置数据库的数量,默认数据库为0 databases 16 ###制定本地持久化文件的文件名,默认是dump.rdb dbfilename redis_6379.rdb ###bgsave触发条件 save 900 1 save 300 10 save 60 10000 ###本地数据库的目录 dir /data/redis_cluster/redis_6379 #进行重启启动服务 [root@redis1 conf]# redis-cli -h 10.0.0.31 shutdown [root@redis1 conf]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf #进行数据的写入,写入10000条数据 [root@redis1 conf]# ll /data/redis_cluster/redis_6379/ 总用量 148 -rw-r--r-- 1 root root 148025 10月 11 14:13 redis_6379.rdb [root@redis1 conf]# sh ~/for.sh #有新的rbd文件自动生成,满足了条件,自动触发bgsave [root@redis1 conf]# ll /data/redis_cluster/redis_6379/ 总用量 148 -rw-r--r-- 1 root root 148025 10月 11 14:16 redis_6379.rdbredis持久化 AOF
AOF持久化,以独立日志的方式记录每次写命令,重启时再执行AOF文件中的命令,打道回府数据的目的,AOF的主要作用是解决了数据持久化的实时性,目的已经是Redis持久化的主流方式
修改配置
[root@redis1 conf]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf ###以守护进程模式启动 daemonize yes ###绑定的主机地址 bind 10.0.0.31 ###监控端口 port 6379 ###pid文件和log文件的保存地址 pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log ###设置数据库的数量,默认数据库为0 databases 16 ###制定本地持久化文件的文件名,默认是dump.rdb dbfilename redis_6379.rdb ###bgsave触发条件 save 900 1 save 300 10 save 60 10000 ###本地数据库的目录 dir /data/redis_cluster/redis_6379 #打开AOF持久化日志功能 appendonly yes #每1个命令,都立即同步到aof appendfsync always ##每秒写1次 appendfsync everysec #写入工作交给操作系统,由操作系统判断缓冲区的大小,统一写入aof appendfsync no appendfilename "appendonly.aof" #进行重启 [root@redis1 conf]# redis-cli -h 10.0.0.31 shutdown [root@redis1 conf]# redis-server redis_6379.conf [root@redis1 conf]# ll /data/redis_cluster/redis_6379/ 总用量 596 -rw-r--r-- 1 root root 367811 10月 11 14:29 appendonly.aof -rw-r--r-- 1 root root 147886 10月 11 14:29 redis_6379.rdb [root@redis1 conf]# ll /data/redis_cluster/redis_6379/ 总用量 596 -rw-r--r-- 1 root root 367811 10月 11 14:29 appendonly.aof -rw-r--r-- 1 root root 147886 10月 11 14:29 redis_6379.rdb #修改一个都会进行写入aof文件 [root@redis1 conf]# redis-cli -h 10.0.0.31 set key8 v8 OK [root@redis1 conf]# ll /data/redis_cluster/redis_6379/ 总用量 508 -rw-r--r-- 1 root root 367842 10月 11 14:30 appendonly.aof -rw-r--r-- 1 root root 147886 10月 11 14:29 redis_6379.rdb



