Redis - Persistence

持久化的作用

Redis一般是将数据存在内容中的,但是断电的话就丢掉了,持久化可以把数据保存在磁盘中,从而可以断电恢复。

一般有两种持久化的方法

RDB

什么是RDB,即存储一个数据的snapshot快照。

流程如下:

redis_per_1

三种方式

save

两个注意点:

bgsave

流程如下:

redis_per_2

需要注意的是:fork()一般非常快,但是极端情况可能会阻塞。

自动

本质是两步:

检查策略:(满足任意一个条件)

redis_per_3

即如果60s内,发生了10000个修改,则做一次bgsave。 这里为什么这么设置呢?首先,短时间内(60s),我们不希望频繁地自动保存,所以这个值要设大一些。然后,长时间内(900s),我们也不希望硬盘和内存的数据差异太大,所以这个值要设置小一些。

默认配置和最佳配置

redis_per_4

触发机制

潜在问题

AOF

AOF的原理其实是写日志。将每一条操作记录下来(先写到缓冲区中,再写到文件中),需要恢复时读取日志还原现场。

创建

redis_per_5

恢复

redis_per_6

三种策略

即什么时候将缓冲区中的内容保存(fsync)到文件中。

比较

redis_per_7

重写

AOF重写是将过期的,重复的,没有用的命令进行优化,重写。从而可以:

举例:increby1亿次,其实可以优化为set counter 1亿,大大节省空间和时间。

redis_per_8

命令:bgrewriteaof

重写流程

redis_per_9

重写rewrite配置

auto-aof-rewrite-min-size:尺寸(第一次重写时,文件需至少需要多大)
auto-aof-rewrite-percentage:增长率(再次重写时,文件需要比之前增长多少倍)

其它aof配置

appendonly yes
appendfilename "appendonly-${port}.aof"
appendfsync everysec
dir /bigdiskpath
no-appendfsync-on-rewrite yes

RDD和AOF比较

redis_per_10

RDB最佳策略

AOF最佳策略

最佳策略

其它

fork 操作

改善

子进程开销和优化

CPU

内存

硬盘

AOF阻塞

AOF操作如果耗时过长,可能会发生阻塞。

redis_per_11

可以通过以下几种方法定位问题:

  1. 日志
Asynchronous AOF sync is taking too long...
  1. Redis命令
    > info persistence`
    -> aof_delayed_fsync:100
    
  2. Linus命令

top观察机器的使用情况

redis_per_12

Fork me on GitHub