参考
相对于memcache,redis的是数据可以做持久化处理,主要有两种方式,快照rdb和追加文件aof,redis是持久化处理是比较耗时,一般在主从模式中,master不做持久化处理,由slave处理
什么是Redis持久化?
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
快照rdb
- redis使用操作系统的多进程COW机制(Copy On Write)复制写机制来实现快照的持久化
- 由子进程进行持久操作,子进程刚刚产生时,和父进程共享内存里面的代码段和数据段
- 子进程会
配置
持久化有两个命令,save
和bgsave
,save
会阻塞服务进程,直到持久化完成,bgsave
会fork子进程,由子进程去完成持久化,bgsave
对应配置如下:
1 | // 满足以上三个条件中的任意一个,则自动触发 BGSAVE 操作 |
rdb文件结构
https://www.cnblogs.com/lizhimin123/p/10192217.html
- REDIS:5字节,保存着 “REDIS” 五个字符
- db_version:4字节,RDB文件的版本号
- database 0:数据库中的键值对
- SELECTDB:1字节常量
- db_number:数据库号码
- key_value_pairs:键值对
- type: 记录类对象的编码类型,程序会根据 TYPE 属性来决定如何读入和解释value数据
- key
- value
- EOF:RDB文件的结束标志
- check_sum:校验和(CRC64),用来检查RDB文件是否出错
rdb问题
- 持久化过程中数据发生改变?
rdb文件被成为快照文件,子进程所看到的数据在它被创建的一瞬间就固定下来了,父进程修改的某个数据只是该数据的复制品。(父子进程共享内存,数据发生写时会另外复制一份数据进行修改)
优点:
追加日志aof
redis将指令追加到日志,通过回放指令来恢复数据,随着时间的增大会有日志文件变大的问题,这就需要重写日志
aof重写日志的过程是怎么样的?
- fork子进程
- 子进程遍历内存数据写到新的aof文件
- 在生成新的aof文件的过程中,如果收到新指令,则继续保存在系统内存缓存中
- 完成新的aof文件之后,将系统内存缓存数据追加到新的aof文件
- 新的aof文件代替旧的aof文件