带你走进Redis的世界 - Redis的持久化

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 带你走进Redis的世界 - Redis的持久化

前言

Redis的数据正常都是存储在内存内,如果宕机突然发生,数据就会全部丢失,因此需要提供一种方式保证redis的数据不会因为故障而丢失,这种机制就是redis的持久化机制。

redis的持久化机制分为:

  • 快照 snapshot模式 全量模式
    快照,是一次全量的备份,是内存数据二进制序列化形式,在存储上非常紧凑
  • AOF日志模式 增量模式
    AOF日志是连续的增量备份,长期运行过程中,会变得无比庞大,而且,如果发生宕机,需要读取所有的日志文件,进行恢复,需要大量的时间,所以需要定期对AOF重写,瘦身日志文件

image.png

快照原理

正如我们之前,聊过的,redis是一款单线程程序,该线程要同时负责多个客户端的并发读写操作和内存数据结构的逻辑读写。

在服务线上请求的同时,Redis需要进行内存快照,内存快照要求Redis必须进行文件IO操作,因为是单线程,所以文件IO操作就不能使用多路复用API。

意味着,Redis在进行完成服务线上请求的同时,还要进行文件IO操作,会严重影响服务器的性能,

同时,Redis不能阻塞客户端的请求,导致线上业务不可用,那么Redis就需要一边持久化,一边进行响应客户端请求。

针对以上问题难点,Redis采用多线程COW(Copy On write)机制来实现快照持久化。

fork(多线程)

Redis是有状态的节点,每次客户端请求服务端对数据的写操作,都会触发状态的改变。基于全量模式的持久化,通过在状态改变的瞬间,触发snapshot进行保存。

image.png

Redis的全量写入包含两种方式:SAVE BGSAVE

image.png

save可以通过客户端显式触发,也可以在redis shutdown时触发,save本身通过redis命令,单线程串行化执行保存。阻塞其他的操作。

bgsave可以通过客户端显式触发,也可以通过定时任务触发,也可以在主从模式下,由从节点触发。

对于bgsave,redis在持久化时,调用glibc函数fork产生一个子进程,快照持久化,完全交给子进程处理,父进程继续处理客户端请求。

子进程做数据持久化,不会修改现有的内存数据结构,只是对数据结构进行遍历读取,序列化,写入到磁盘中。

相比save,bgsave不会影响父进程执行处理客户端请求,但是产生子进程,增加服务器内存的开销。产生fork进程,会造成在复制父进程中,存在秒级的不可用

AOF原理

在Redis中,增量持久化称为AOF(Append-only file)方式。Redis仅对数据的变化进行存储,类似于日志文件。

image.png

AOF日志文件存储的是Redis服务器的顺序指令序列,AOF日志只记录内存改变的指令。

Redis的增量持久化,存在于每次处理完写命令之后,通过propagate函数触发。

Redis的AOF包含三种同步策略:

  1. always 每次执行完命令,直接同步触发fsync方法,强制数据落地磁盘。会降低redis的吞吐量,每次当落地成功,才响应给客户端,因此此种方式,很大程度的有很好的容错能力
  2. every second 每秒异步触发一次fsync方法。
  3. no 不显式调用fsync方法,由操作系统决定什么时候落地。

对于Redis数据的回放,即对数据的重写,全量和增量,触发时机一致。

Redis 4.0 混合持久化

重启redis时,很少使用rdb即快照方式进行恢复数据,因为会丢失大量数据,通常采用AOF才进行重放。但是AOF日积月累会很庞大,因此会花费很长时间进行重放。

Redis 4.0为解决上述问题,采用混合持久化。在重启redis时,进行先加载rdb内容,然后重放增量AOF文件,此时,重启效率会优化很多。

更多的,可以参考下官方介绍。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
监控 NoSQL Linux
【分布式】Redis的持久化方案解析
【1月更文挑战第25天】【分布式】Redis的持久化方案解析
|
3月前
|
存储 NoSQL 安全
Redis持久化原理以及配置
Redis持久化原理以及配置
108 0
|
3月前
|
NoSQL 关系型数据库 MySQL
Redis持久化机制 RDB 和 AOF 的选择
Redis持久化机制 RDB 和 AOF 的选择
55 0
|
18天前
|
缓存 NoSQL Shell
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)
24 0
|
1月前
|
缓存 NoSQL Redis
[Redis]——Redis持久化的两种方式RDB、AOF
[Redis]——Redis持久化的两种方式RDB、AOF
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 两种持久化方式 AOF 和 RDB
Redis 两种持久化方式 AOF 和 RDB
|
1月前
|
NoSQL Redis 数据库
【怒怼大厂面试官】听说你精通Redis?说说Redis持久化
咳咳咳,看你简历写了精通Redis,那我就随便问问。主要有RDB持久化、AOF持久化。是这样,Redis服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新AOF文件期间,记录服务器执行的所有写命令。
51 1
【怒怼大厂面试官】听说你精通Redis?说说Redis持久化
|
2月前
|
存储 NoSQL Redis
Redis淘汰策略、持久化、主从同步与对象模型
Redis淘汰策略、持久化、主从同步与对象模型
88 0
|
2月前
|
NoSQL Redis 数据库
Redis的安全网:掌握RDB和AOF的持久化技术【redis第四部分】
Redis的安全网:掌握RDB和AOF的持久化技术【redis第四部分】
119 0
|
2月前
|
NoSQL Redis
spring-state-machine使用redis持久化
spring-state-machine使用redis持久化
26 0