Redis不仅可以作为缓存来使用,也可以作为内存数据库。Redis作为内存数据库使用时,必须要解决一个问题:数据的持久性。有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上,这样在Redis重启后仍然能对热点数据提供缓存服务,不会因为缓存数据的缺失而对整个系统造成冲击。
本文就Redis内置的持久化机制进行说明。
Redis内置的持久化方式有两种:快照方式和AOF方式。快照方式是将某一时点的内存数据写到硬盘上,AOF方式是将写入的命令记录在硬盘上的文件里。下面详细说明这两种方式。
快照方式可以将一个时点的内存数据保存到硬盘。保存快照之后Redis重启时可以读取快照文件而恢复数据,也可以使用快照来建立复制对应的Redis服务器。
既然快照是保存某一个时点的内存数据,那么就要求在进行快照时内存数据不能发生变化。关于这点Redis有两种模式:SAVE和BGSAVE。SAVE模式首先使Redis停止服务,然后将这个时点的Redis内存数据写入到硬盘中,等完成写入后Redis开始提供服务,这个过程一般会比较长,在生产环境中使用的场景较少。BGSAVE模式会使用fork命令拷贝Redis的内存,在fork过程中Redis也会停止对外服务,但这个过程非常快,在实体机或者VMWare和KVM中1G的内存拷贝大概在10-20ms,而在Xen中要稍慢些,大概在200-300ms。拷贝内存完成后,拷贝的这份内存数据开始持久化到硬盘,同时Redis也继续对外提供服务。
SAVE模式对Redis可用性影响很大,可能使Redis在一段较长时间内无法提供服务。BGSAVE模式对Redis可用性影响较小,1G的内存数据会使Redis中断服务10-20ms,这个数值在一般情况下是可以接受的,但是因为BGSAVE是使用fork机制,这就要求fork时系统的可用内存至少要和Redis占用的内存一样大。
触发Redis进行内存快照持久的条件有以下几种:
参数名称 | 参数值 | 参数解释 |
save | m秒 n次,比如60 1000 | 配置触发快照的条件,"60 1000"表示如果在60s内发生了1000次写操作,那么Redis就要进行持久操作 |
stop-writes-no-bgsave-error | yes,no | 配置在BGSAVE发生错误时是否停止 |
rdbcompression | yes,no | 配置是否对持久数据进行压缩 |
dir | 目录路径,比如./ | 配置持久文件保存的目录 |
dbfilename | 持久文件名,比如dump.rdb | 配置持久文件名 |
参数名称 | 参数值 | 参数解释 |
appendonly | yes,no | 配置是否开启AOF持久机制 |
appendfsync | always,everysec,no | 配置AOF持久机制的同步策略 |
no-appendfsync-on-rewirte | yes,no | 配置在重建日志时是否继续进行AOF |
auto-aof-rewrite-percentage | 百分比值 比如100 |
配置触发重建日志的条件:当前日志大小和最后一次重建日志大小的比例,这里的"100"意为当前日志大小超过最后一次重建日志大小100%时,将可能触发重建日志操作。 |
auto-aof-rewrite-min-size | 日志文件大小 比如64mb |
配置触发重建日志的条件:当前日志大小的最小值,这里的"64mb"意为当前日志超过64mb时,将可能触发重建日志操作。要注意的是:auto-aof-rewrite-percentage和auto-aof-rewrite-min-size必须同时满足才可以触发重建日志操作。 |
dir | 目录路径 比如./ |
配置持久文件保存的目录 |
持久化方式 | 可用性影响 | 数据丢失 | 内存占用 | IO负荷 | 硬盘空间占用 |
SAVE | 高 | 分钟级 | 小 | 高 | 较低 |
BGSAVE | 较小 | 分钟级 | 大 | 高 | 较低 |
AOF | 小 | 秒级 | 小 | 较高 | 高 |
AOF+BGREWRITEAOF | 较小 | 秒级 | 大 | 最高 | 较高 |
原文:http://blog.csdn.net/hubin0011/article/details/25239293