Redis持久化
数据的存放方式:
- 如Redis存放在内存:内存读写高效但断电会丢失数据
- 如Mysql存放在磁盘:读写速度慢,但不会丢失数据
Redis是在内存中运行的,为了防止服务器宕机造成数据丢失,需要将内存中的数据存入磁盘(持久化)
Redis提供了两种持久化策略:
- RDB(默认):一定时间存储数据
- AOF:默认每秒存储历史命令
Redis是支持持久化的内存数据库,需要经常将内存的数据同步到磁盘
RDB
RDB : Redis DataBase,一定间隔时间持久化一次,功能核心是rdbSave(生成RDB文件)和rdbLoad(将RDB文件加载进内存)两个函数
RDB是redis的默认持久化策略,也称为快照,这种策略将内存的数据以快照的方式写入到二进制文件中,默认文件名为dump.rdb
- 优点:快照存取数据快,适用与灾难备份
- 缺点:消耗内存大,小内存机器不适合
快照条件:
- 服务器正常关闭
shutdown
- key满足一定条件会进行快照,在redis.conf配置文件中设置相关属性
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改就同步到磁盘,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
在哪里操作的redis就在哪生成的dump.rdb
AOF
RDB是一定间隔时间持久化一次,如果服务器宕机,会丢失最后一次快照后的所有修改
如果需求不能丢失任何修改,采用AOF策略
AOF:Append-only file,将每一个收到的命令都通过write函数追加到文件(默认appendonly.aof),当redis重启会通过该文件保存的命令在内存中重建数据库
flushAppendOnlyFile函数:每次只需服务器任务或者函数时,该函数都会调用,该函数执行以下两个过程
- write:将aof_buf中缓存写入到aof文件
- save:调用fsync或fdatasync函数,将aof文件保存到磁盘
AOF有三种方式,redis.conf里可以配置:
- appendonly yes,启动aof持久化策略
- appendfsync always,表示每次更新操作后立即调用fsync()将数据写到磁盘(慢,安全)
- appendfsync everysec,表示每秒同步一次(折中,默认值)
- appendfsync no:表示等操作系统进行数据缓存同步到磁盘(快,无法保证持久化)
AOF策略:
- 优点:安全,数据不会丢失
- 缺点:持久化文件会越来越大(多次重复命令,命令多余)