redis中数据持久化介绍
目前会在两种情况下使用
1. 作为数据库使用;
2. 作为缓存服务器使用。
redis的高性能很大程度上是因为其把数据存储在内存中,然而当redis重启时或者意外当机后,数据都会丢失。为了不让redis中数据丢失,我们需要把内存中的数据以某种方式存储的硬盘中,使得redis服务器重启后数据可以恢复,这一过程称之为持久化。
redis支持两种方式的数据持久化,一是RDB方式;二是AOF方式。
RDB方式会根据指定的规则,“定时”将内存中的数据写入硬盘中;
AOF方式每次执行命令会将命令本身记录下来。
两种方式都可以单独使用,通常是两者配合使用。下面分别对两种方式介绍。
以下配置都是通过修改redis根目录下的redis.conf文件
一. RDB方式
RDB的方式是通过快照(snapshot)完成,当符合规则时redis会把内存的数据生成一个副本并存储在硬盘中,这个过程称之为“快照”。
redis会在以下几种情况执行快照
1. 根据配置规则自动快照
2. 用户执行save或bgsave命令
3. 执行flushall命令
4. 执行复制时。
下面对以上4中方式分别介绍
1.1 根据配置规则自动快照
用户可以自定义快照条件,用户可以在配置文件中自定义,格式如下:
save 时间 改动键的个数
save是关键字;时间是指在多长时间内,单位是秒;改动键的个数是指在指定时间内,被更改的个数大于我们指定的改动键个数时,自动执行快照。
如:
save 100 1
save 60 10
save 30 1000
命令允许存在多个,它们之间的关系式或者关联。以上的命令意思是,每隔100秒,保存一次;或者,60秒内,有10个以上键值发生变化;或者,30秒内,有1000个键值发生变化。当满足以上3个条件任何之一,redis会自动快照。
1.2 用户执行save或bgsave命令
当我们需要重启redis服务、迁移redis服务、备份redis服务时,需要手动执行快照,这时可以使用save或者bgsave命令。
save:同步执行,这时会影响用户请求,当redis数据比较大时,不建议使用此命令;
bgsave:后台异步执行,不影响用户对redis的请求。可以使用lastsave命令,查看最后快照时间。
1.3 执行flushall命令
执行flushall命令时,会清除redis中所有数据。当有任何一个自定义快照条件是,都会触发快照操作;若没有自定义任何快照规则,则不会触发自定义快照。
1.4 执行复制时。
当redis服务配置了主从复制时,即使没有配置任何自定义快照条件,没有执行任何手动操作(执行save或者bgsave),也会执行快照。
redis默认会将快照文件存储在当前目录下的dump.rdb文件中,可以配置dir和dbfilename两个参数分别之间文件路径和文件名。
如:
dir c:\gyc
dbfilename dump.rdb
注:通过RDB方式持久化redis,一旦redis异常退出,那么都会丢失最后一次快照后的所有更改的数据。如果不能接受丢失的这些数据,建议使用AOF方式持久化数据。
二. AOF(append only file)方式
当使用redis来存储非临时数据时,需要开启AOF方式持久化。AOF将redis执行的每一条命令追加到磁盘中,这样会降低redis的性能,不够还是可以接受的。
2.1. 开启AOF方式
默认情况redis没有开启AOF方式,可以通过appendonly命令来启用,如:
appendonly yes
可以指定存储文件路径,如:
dir c:\redis_aof
appendfilename appendonly.aof
2.2. 同步到磁盘中
虽然每次操作,redis都会把命令写到AOF文件中,但是由于操作系统缓存机制,这时并没有把所有数据真正写到磁盘中,而是进入到硬盘缓存。一般情况下,系统会每隔30秒做一次把硬盘缓存中数据写入磁盘中。
可以通过以下命令,执行:
# appendfsync always
# appendfsync no
appendfsync everysec
第一条命令是,每次执行写入,都会执行同步,最安全也最慢;
第二条命令是,不主动执行同步,而是由系统自动执行,也就是30秒执行,不建议,有可能会丢失30秒的数据;
第三条命令是,每秒执行一次,redis默认执行此种;
redis支持同时开启RDB和AOF,系统重启后,redis会使用AOF来恢复数据。这样丢失的数据会最少。