快照
快照,主要涉及的是redis的RDB持久化相关的配置,可以用如下的指令来让数据保存到磁盘上,即控制RDB快照功能:
save
举例来说:
save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久化
若想禁用RDB持久化的策略,只要不设置任何save指令就可以,或者给save传入一个空字符串参数也可以达到相同效果,就像这样:
save ""
如果用户开启了RDB快照功能,那么在redis持久化数据到磁盘时如果出现失败,默认情况下,redis会停止接受所有的写请求。这样做的好处在于可以让用户很明确的知道内存中的数据和磁盘上的数据已经存在不一致了。如果redis不顾这种不一致,一意孤行的继续接收写请求,就可能会引起一些灾难性的后果。如果下一次RDB持久化成功,redis会自动恢复接受写请求。当然,如果你不在乎这种数据不一致或者有其他的手段发现和控制这种不一致的话,你完全可以关闭这个功能,以便在快照写入失败时,也能确保redis继续接受新的写请求。配置项如下:
stop-writes-on-bgsave-error yes
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbcompression yes
在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum yes
还可以设置快照文件的名称和路径,默认是这样配置的:
dbfilename dump.rdbdir ./
追加模式
默认情况下,redis会异步的将数据持久化到磁盘。这种模式在大部分应用程序中已被验证是很有效的,但是在一些问题发生时,比如断电,则这种机制可能会导致数分钟的写请求丢失。
追加文件(Append Only File)是一种更好的保持数据一致性的方式。即使当服务器断电时,也仅会有1秒钟的写请求丢失,当redis进程出现问题且操作系统运行正常时,甚至只会丢失一条写请求。 建议AOF机制和RDB机制同时使用,不会有任何冲突。appendonly no # yes开启
设置aof文件的名称
appendfilename "appendonly.aof"
fsync()调用,用来告诉操作系统立即将缓存的指令写入磁盘。一些操作系统会“立即”进行,而另外一些操作系统则会“尽快”进行。
redis支持三种不同的模式:-
- no:不调用fsync()。而是让操作系统自行决定sync的时间。这种模式下,redis的性能会最快。
-
- always:在每次写请求后都调用fsync()。这种模式下,redis会相对较慢,但数据最安全。
-
- everysec:每秒钟调用一次fsync()。这是性能和安全的折衷。
默认情况下为everysec。
appendfsync everysec
当fsync方式设置为always或everysec时,如果后台持久化进程需要执行一个很大的磁盘IO操作,那么redis可能会在fsync()调用时卡住。目前尚未修复这个问题,这是因为即使在另一个新的线程中去执行fsync(),也会阻塞住同步写调用。
为了缓解这个问题,可以使用下面的配置项,这样的话,当BGSAVE或BGWRITEAOF运行时,fsync()在主进程中的调用会被阻止。这意味着当另一路进程正在对AOF文件进行重构时,redis的持久化功能就失效了,就好像设置了“appendsync none”一样。如果你的redis有时延问题,那么请将下面的选项设置为yes。否则请保持no,因为这是保证数据完整性的最安全的选择。no-appendfsync-on-rewrite no
允许redis自动重写aof。当aof增长到一定规模时,redis会隐式调用BGREWRITEAOF来重写log文件,以缩减文件体积。
redis是这样工作的:redis会记录上次重写时的aof大小。假如redis自启动至今还没有进行过重写,那么启动时aof文件的大小会被作为基准值。这个基准值会和当前的aof大小进行比较。如果当前aof大小超出所设置的增长比例,则会触发重写。另外,你还需要设置一个最小大小,是为了防止在aof很小时就触发重写。auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
如果设置auto-aof-rewrite-percentage为0,则会关闭此重写功能。