Redis源码学习-AOF数据持久化原理分析(0)

Redis源码学习-AOF数据持久化原理分析(0)

Redis作为一个使用广泛的KV内存存储,其也支持一定的数据持久化,这里试着介绍一下Redis在源码层面对持久化的实现机制。 总的来说,Redis支持的将其数据库里面的KV数据存储到磁盘,但可能会有短时间的丢失。官网关于持久化的介绍可以参考这里“Redis Persistence”,这篇文章介绍一下其在代码层面的实现。 其支持2中不同的持久化机制: 第一种RDB数据快照持久化。RDB持久化实际上就是对数据库内容做快照,然后将快照存储到磁盘上面,这样就要去我们进行周期性的做快照,但是这种方式无法做到实时的存储,出现故障时只能恢复上一次做快照时的状态,因此比较有限。不过redis的主从同步也是利用RDB实现的,这个我们后续文章分析; 第二种AOF日志实时持久化。AOF=Append Only File,也就是不断追加写的文件。在这种情况下,Redis首先将数据库做个快照,将数据还原为跟客户端的协议格式的文本数据,然后将其存储到一个临时文件中,然后将其覆盖成正常的aof文件,并把这个过程中新增的命令追加到aof文件后面,从此之后,后续的从客户端过来的命令都会不断根据不同的安全级别写到磁盘里面去。这样就支持了实时的持久化,只是可能会有短时间内的数据丢失,对一般系统还是可以容忍的。 下面一步步介绍其实现的原理。 0、数据初始化 当redis启动时,如果打开了aof开关,也就是配置了:”appendonly on”,那么就会从”appendfilename”指令指定的文件中加载数据库数据进行初始化;其调用流程为: main()->loadDataFromDisk(),后者会判断server.aof_state == REDIS_AOF_ON,如果是,就调用loadAppendOnlyFile函数去加载数据文件的数据,加载的方法就是把文件内容读出来当客户端请求一样调用各个命令的cmd->proc(fakeClient);还原数据,其实就是进行操作重放。 如果没有配置”appendonly on”,那么redis就会从RDB文件中加载数据。 /* Function called at startup to load RDB or AOF file in memory. */ void loadDataFromDisk(void) { long long start = ustime(); if (server.aof_state == REDIS_AOF_ON) { //如果AOF打开了,那么优先从AOF文件中加载数据,因为AOF文件的数据比RDB中的数据要新。 if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK) redisLog(REDIS_NOTICE,”DB loaded from append only file: %.3f seconds”,(float)(ustime()-start)/1000000); } else { //否则就从RDB文件中加载数据。 if

来源: Redis源码学习-AOF数据持久化原理分析(0) | 趁着年轻

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
31 views

发表评论

电子邮件地址不会被公开。 必填项已用*标注

跳至工具栏