Redis持久化

持久化简介

  • 数据持久化就是将数据存储到断电后数据不丢失的设备中
  • Redis的持久化包括RDB和AOF两种⽅式
  • 持久化的一般步骤如下:
  • 客户端向服务发送写请求
  • 服务端接受写请求
  • 服务端调用Write系统调用,发送写数据请求
  • OS将缓冲区的数据写到存储介质
  • 磁盘控制器将数据写到磁盘的物理介质中

通信协议

在介绍Redis持久化之前有必要介绍下Redis的通信协议,因为这部分和后面讲的某种持久化策略有很多相似的地方。Redis的通信协议设计的有以下三个特点:

  • 易于实现
  • 可以高效的被计算机分析
  • 可以很容易被人类读懂

数据发送协议

1
2
3
4
5
6
7
8
9
10
11
*<参数数量> CR LF
$<参数1的字节数量> CR LF
<参数1的数据> CR LF
...
$<参数N的字节数量> CR
示例:
*3
$3
SET
$5 mykey
$7 myvalue

数据接受协议

1
2
3
4
5
6
7
8
9
状态回复(status reply)的第⼀一个字节是 "+"
错误回复(error reply)的第⼀一个字节是 "- "
整数回复(integer reply)的第⼀一个字节是 ":"
批量量回复(bulk reply)的第⼀一个字节是 "$"
多条批量量回复(multi bulk reply)的第⼀一 个字节是 "*"
示例:
客户端:GET mykey
服务器器:foobar
"$6\r\nfoobar\r\n"

AOF详解

AOF(Append Only File )是基于变更日志的持久化。以文本追加的方式进行持久化,文本内容如数据发送协议。AOF的持久化策略如下:

  • AOF_FSYNC_NO:不保存
  • AOF_FSYNC_EVERYSEC:每秒钟保存⼀次
  • AOF_FSYNC_ALWAYS:每次执⾏数据变更命令

使用AOF的方式进行持久化,可以让服务保留更多的持久化数据,但是以追加的方式写数据,会导致AOF文件不断的膨胀,所以需要定期的进行Rewrite,所谓Rewrite就是把记录在AOF文件中的重复命令清理掉,如下情况会在AOF文件中一直追加,所谓rewrite操作就是将多次操作归并为单次操作,需要特别说明的是AOF文件的rewrite支持在后台使用单独的进程操作。

1
2
3
4
set mykey  aaa
set mykey bbb
set mykey ccc
set mykey ddd

RDB详解

RDB是基于数据快照的持久化,持久化发生在RDB快照的时刻,快照时刻用如下参数控制:

1
2
3
4

save 900 1 //900秒内⾄少1个key值改变,则进⾏一次持久化
save 300 10 //300秒内至少10个Key值改变,则进行一次持久化
save 60 10000 //60秒内至少10000个Key值改变,则进行一次持久化

从上面的策略可以看出,RDB的持久化是一种兼顾时间和空间的控制策略,但同AOF相比,数据一般不如AOF完备,但是由于RDB使用的是紧凑的二进制格式保存数据,所以在磁盘上占用更少的存储空间。基于RDB的数据持久化同AOF的Rwrite一样,也支持使用后台进程操作。

AOF与RDB比较

  • AOF保存的数据集⽐RDB更完整
  • RDB⽂件比AOF⽂件更加紧凑
  • RDB⽂件恢复速度优于AOF

更多图文资料

https://github.com/chaubeau/Redis-Lesson.git