八、Redis源码持久化之RDB


redis database内存快照

一、RDB创建的入口函数和触发时机

源码文件:rdb.c 和 rdb.h

int rdbSaveBackground(char *filename, rdbSaveInfo *rsi); Redis的bgsave命令

int rdbSaveToSlavesSockets(rdbSaveInfo *rsi); Redis执行主从复制命令以及周期性监测主从复制状态触发RDB生成
int rdbSave(char *filename, rdbSaveInfo *rsi); Redis的save命令

除了上面3中时机触发RDB生成外,还有哪些?

rdbSave还会在flushallCommand函数(在db.c文件中)、prepareForShutdown函数(在server.c文件中)中被调用,所以Redis在执行flushall命令以及正常关闭时也会触发创建RDB文件。

二、RDB文件结构

文件头:Redis的魔数、RDB版本、Redis版本、RDB文件创建时间、键值对占用的内存大小

文件数据部分:实际的所有键值对数据

文件尾:文件结束符、文件的校验值(redis server加载rdb文件后,检查文件是否被篡改过)

RDB文件生成的核心函数是rdbSaveRio函数,这里我就不做过多的分析了。

三、RDB核心参数配置

################################ SNAPSHOTTING  ################################
#
# Save the DB on disk:
#   save  
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed 900秒内有一个变更
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed

save 900 1
save 300 10
save 60 10000

# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.
#
# If the background saving process will start working again Redis will
# automatically allow writes again.
#
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes 创建新的后台进程建rdb文件

# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes 数据压缩

# Since version 5 of RDB a CRC64 checksum is placed at the end of the file.
# This makes the format more resistant to corruption but there is a performance
# hit to pay (around 10%) when saving and loading RDB files, so you can disable it
# for maximum performances.
#
# RDB files created with checksum disabled have a checksum of zero that will
# tell the loading code to skip the check. 数据压缩
rdbchecksum yes 默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

# The filename where to dump the DB 快照文件名
dbfilename dump.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name. 快照文件存放目录
dir ./