redis持久化有两种方式:
RDB
什么是RDB
是把redis数据库中的数据原样保存的硬盘当中;
为什么需要持久化:
redis是在内存中的key-value数据库,当服务器关闭的时候或故障断电的时候如果没有持久化功能数据会全部丢失;
RDB文件的创建和导入
命令:
- save:阻塞进程
- bgsave:子进程处理,不会阻塞
载入:
自动检测,发现就会载入,载入过程是阻塞状态,aof开启默认载入aof文件
一个持久化命令执行时拒绝其他持久化命令的执行
自动间隔保存
保存条件:
- 例如:save 60 10000 60秒内有10000次操作自动进行保存//这个条件是可以配置的
- saveparams 以键值对数组的形式存在,保存之前依次校验是否符合保存的条件,只要符合数组的任一条件就会执行保存
dirty计数器:db从上次保存之后db状态修改次数
lastsave:Unix时间戳,上次修改的时间
条件检查:
- 每隔100ms检查一次是否符合条件
- 满足任一条件执行bgsave
- 每次保存后dirty计数器清零
RDB文件结构
database中可以包含任意多个非空数据库
database的结构
AOF持久化
实现原理
把给服务器执行的命令保存下来,服务器的状态就是执行完所有命令的状态;为了提高效率不是每次都要写入磁盘,而是先写入缓存区,再通过同步的方式把缓存区的数据同步到磁盘;
同步方式
- always:每次操作都会同步,速度最慢,最安全,最多丢失一条数据
- everysec:每秒同步一次,足够快,丢失一秒钟的数据
- no:操作系统来决定何时持久化,速度最快,丢失上次保存到这次的所有数据
载入与还原
- 创建伪客户端
- 分析读取命令
- 执行写命令
- 重复23步骤,直到结束
重写
why?
文件过大,造成负担
bgrewriteaof 新文件代替旧文件
实现
读取键现在的值
用一条命令代替多条命令
重写不一定就是一条命令代替多条
后台重写
why:避免阻塞
子进程重写期间父进程继续处理请求,数据会不一致
解:服务器执行一条命令把写命令写入aof缓冲区和重写缓冲区
解:子进程重写完成后,通知父进程,把重写缓冲区的文件写入新aof文件