redis的持久化

概述

redis是基于内存的非关系型数据库,说起redis的持久化机制,先说一下redis和另外一个操作内存的非关系型数据库memcached的区别:

  1. redis可以存储多种类型的数据(字符串、hash、列表、集合等),memcached只能存储简单的key-value数据
  2. redis是单线程的,memcached支持多线程操作(处理比较小的数据时,redis效率高些,处理比较大的数据时,memcached的多线程更具有优势)
  3. memcached不支持持久化,而redis支持,可以将内存中的数据保存到磁盘上,避免由于服务器故障导致数据丢失,也就是本篇文章要说的

redis的持久化方式有两种

1、RDB

  • rdb是通过快照的方式存储到磁盘的,当符合一定的条件时就会自动触发保存到硬盘,是redis默认的持久化方式,具体的条件参数可以在redis.conf中进行配置。
  • 在redis.conf中配置rdb
save 900 1  #表示15分钟(900秒钟)内至少1个键被更改则进行快照。
save 300 10 #表示5分钟(300秒)内至少10个键被更改则进行快照。
save 60 10000  #表示60秒(1分钟)内有至少10000个键被改动则进行快照 
#上面三个条件是或的关系,只要一个满足,就执行
dbfilename "dump.rdb"          #持久化文件名称
dir "/data/dbs/redis/6381"    #持久化数据文件存放的路径
  • rdb的持久化方式也分为两种:
  1. SAVE:是一种阻塞值的方式,当把数据从内存写入到磁盘时,redis不能处理其他命令
  2. BGSAVE:非阻塞的方式,会专门创建一个子进程来处理数据写入磁盘,不影响redis其他命令的执行(持久化时,会占用很高的系统内存)
  • 服务器重启后,会从磁盘中读取dump.rdb文件到内存中;但是如果redis在一次快照存储条件触发之前异常退出的话,会丢失部分数据,要是对数据进行完整持久化,那么需要使用aof方式进行持久化。

2、AOF

与rdb每次存储快照都要保存整个数据库的数据不同,aof是记录服务端的数据写入命令来保存redis数据库当前状态的,aof持久化方式默认是关闭的,需要通过配置开启

  • aof文件示例
redis@iZ]$ more appendonly.aof
 
*2
 $6
 SELECT
 $1
 0
 *3
 $3
 SET
  • 在redis.conf中配置aof
dir "/data/dbs/redis/6381"           #AOF文件存放目录
 appendonly yes                       #开启AOF持久化,默认关闭
 appendfilename "appendonly.aof"      #AOF文件名称(默认)
 appendfsync no                       #AOF持久化策略
 auto-aof-rewrite-percentage 100      #触发AOF文件重写的条件(默认)
 auto-aof-rewrite-min-size 64mb       #触发AOF文件重写的条件(默认)
  • appendfsync有三个选项:always、everysec和no:
  1. 选择always的时候服务器会在每执行一个事件就把AOF缓冲区的内容强制性的写入硬盘上的AOF文件里,可以看成你每执行一个redis写入命令就往AOF文件里记录这条命令,这保证了数据持久化的完整性,但效率是最慢的,却也是最安全的;
  2. 配置成everysec的话服务端每执行一次写操作(如set、sadd、rpush)也会把该条命令追加到一个单独的AOF缓冲区的末尾,并将AOF缓冲区写入AOF文件,然后每隔一秒才会进行一次文件同步把内存缓冲区里的AOF缓存数据真正写入AOF文件里,这个模式兼顾了效率的同时也保证了数据的完整性,即使在服务器宕机也只会丢失一秒内对redis数据库做的修改;
  3. 配置成no则意味redis数据库里的数据就算丢失你也可以接受,它也会把每条写命令追加到AOF缓冲区的末尾,然后写入文件,但什么时候进行文件同步真正把数据写入AOF文件里则由系统自身决定,即当内存缓冲区的空间被填满或者是超过了设定的时限后系统自动同步。这种模式下效率是最快的,但对数据来说也是最不安全的,如果redis里的数据都是从后台数据库如mysql中取出来的,属于随时可以找回或者不重要的数据,那么可以考虑设置成这种模式。

3、redis数据的恢复

  • 两种持久化方式生成的.rdb或.aof文件放到redis的安装目录(例如“/usr/local/redis/bin”),重新启动redis服务即可,如果两种文件都存在的话:
  1. 如果只配置 AOF ,重启时加载 AOF 文件恢复数据;
  2. 如果同时配置了 RDB 和 AOF ,启动是只加载 AOF 文件恢复数据;
  3. 如果只配置 RDB,启动是将加载 dump 文件恢复数据。

4、两种方式的优缺点

  • rdb:每次保存的都是一份数据快照文件,在恢复大量数据的时候比较快,但是如果服务器突然故障还没来得及触发最近的保存操作,会丢失一部分数据,对数据完整性要求特别高的话不适合。
  • aof:相比较于rdb,aof可以最大限度的保证数据不丢失,但是其文件体积更大,恢复的速度也更慢
  • 总结来说,rdb性能更快,但是会丢失部分数据;aof能保证数据安全,但是性能慢一些