缓存持久化

RDB

RDB持久化是把当前进程数据生成快照保存到硬盘,

命令为

  • save 阻塞执行,已废弃
  • bgsave 创建子进程执行

bgsave执行结果

33375:M 24 Sep 16:39:02.580 * Background saving started by pid 34280
34280:C 24 Sep 16:39:02.592 * DB saved on disk
34280:C 24 Sep 16:39:02.593 * RDB: 6 MB of memory used by copy-on-write
33375:M 24 Sep 16:39:02.599 * Background saving terminated with success

save执行结果

33375:M 24 Sep 16:39:02.599 * Background saving terminated with success
33375:M 24 Sep 16:41:27.320 * DB saved on disk

触发机制:

  • 手动触发
  • 自动触发
    • 1) 使用save相关配置, 如“save m n”。 表示m秒内数据集存在n次修改时, 自动触发bgsave。
    • 2) 如果从节点执行全量复制操作, 主节点自动执行bgsave生成RDB文件并发送给从节点。
    • 3) 执行debug reload命令重新加载Redis时, 也会自动触发save操作。
    • 4) 默认情况下执行shutdown命令时, 如果没有开启AOF持久化功能则自动执行bgsave。

bgsave运行流程

文件压缩

Redis默认采用LZF算法对生成的RDB文件做压缩处理, 压缩后的文件远远小于内存大小, 默认开启, 可以通过参数config setrdbcompression{yes|no}动态修改。虽然压缩RDB会消耗CPU, 但可大幅降低文件的体积, 方便保存到硬盘或通过网络发送给从节点, 因此线上建议开启。

RDB优缺点:

优点 缺点
文件小,适于全量备份,便于传输和恢复
Redis加载恢复速度快
bgsave创建子进程操作较重,不能实时/秒级持久化,频繁执行成本过高
RDB二进制文件新老版本可能会不兼容

AOF

记录每次写命令到AOF文件中,恢复时重新执行AOF文件中的命令

策略 说明
always 命令写入aof_buf后调用fsync操作同步到AOF文件,每次写入都会执行,不建议
everysec 命令写入aof_buf后调用系统write操作,write完成后线程返回,fsync同步文件操作由专门线程每秒调用一次。是默认的也是建议的同步策略,兼顾性能和数据安全。理论上宕机只丢1秒数据。
no 命令写入aof_buf后调用write操作,由操作系统负责控制写入AOF,同步周期最长30秒,性能会提升,但安全无法保证。

系统调用write和fsync说明:

  • write操作会触发延迟写(delayed write) 机制。 Linux在内核提供页缓冲区用来提高硬盘IO性能。 write操作在写入系统缓冲区后直接返回。 同步硬盘操作依赖于系统调度机制, 例如: 缓冲区页空间写满或达到特定时间周期。 同步文件之前, 如果此时系统故障宕机, 缓冲区内数据将丢失。

  • fsync针对单个文件操作(比如AOF文件) , 做强制硬盘同步, fsync将阻塞直到写入硬盘完成后返回, 保证了数据持久化。

重写机制

为避免AOF文件越写越大,Redis引入AOF重写机制压缩文件体积。 AOF文件重写是把Redis进程内的数据转
化为写命令同步到新AOF文件的过程。

文件变小原理:

  1. 进程内超时数据不再写入文件
  2. 删除无效命令如:del等,只使用进程内数据直接生成,保留最终写入命令
  3. 集合多次操作命令合并,以64个元素为界拆分为多条

触发:

  • 手动: 调用bgrewriteaof命令。
  • 自动:根据参数确定自动触发时机。
    • auto-aof-rewrite-min-size: AOF重写最小体积
    • ·auto-aof-rewrite-percentage: 代表当前AOF文件空间( aof_current_size) 和上一次重写后AOF文件空间( aof_base_size) 的比
      值。

自动触发时机=aof_current_size>auto-aof-rewrite-min-size&&( aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewrite-percentage
其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看。

127.0.0.1:6380> info Persistence
# Persistence
loading:0
rdb_changes_since_last_save:2
rdb_bgsave_in_progress:0
rdb_last_save_time:1632476935
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_current_size:199
aof_base_size:199
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

aof重写流程

持久化文件加载流程

Redis单线程架构导致无法充分利用CPU多核特性, 通常的做法是在一台机器上部署多个Redis实例。 当多个实例开启AOF重写后, 彼此之间会产生对CPU和IO的竞争。 如果同一时刻运行多个子进程, 对当前系统影响将非常明显, 因此单机下部署多实例时需要采用一种措施, 把子进程工作进行隔离。通过info Persistence命令可以获取监控子进程运行状况的度量指标。基于以下这些指标,可以通过外部程序轮询控制AOF重写操作的串行执行。

Redis缓存持久化相关推荐

  1. Redis缓存持久化:RDB持久化和AOF持久化

    突然挂了!Redis缓存都在内存中,这下完了! 来源 | 编程技术宇宙 作者 | 轩辕之风O 我是Redis,一个叫Antirez的男人把我带到了这个世界上. "快醒醒!快醒醒!" ...

  2. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  3. 执行一次怎么会写入两次数据_Java进阶知识:一文详解缓存Redis的持久化机制,新手看完也会用

    Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制. Redis有两种持久化的方式: ...

  4. 我的架构梦:(六十三) 分布式缓存 Redis 之持久化

    分布式缓存 Redis 之持久化 一.前言 1.学习目标 2.为什么要持久化 二.RDB 1.触发快照的方式 2.RDB执行流程(原理) 3.RDB文件结构 4.RDB的优缺点 三.AOF 1.AOF ...

  5. redis缓存的雪崩、击穿、穿透,淘汰策略,持久化

    1.redis缓存的雪崩.击穿.穿透,在实际中如何处理? 雪崩:缓存不存在,数据库存在,高并发,大量的key 原因:大量数据同时过期,Redis宕机 解决方案:给缓存数据的过期时间上加上小的随机数,避 ...

  6. Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如Red ...

  7. 点赞模块设计:Redis缓存 + 定时写入数据库实现高性能点赞功能

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:solocoder juejin.im/post/5bdc2 ...

  8. Redis RDB 持久化详解

    来自公众号:程序员历小冰 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Re ...

  9. Redis AOF 持久化详解

    来自公众号:程序员历小冰 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Re ...

  10. 彻底理解 Redis 的持久化和主从复制

    作者 | 张君鸿 来源 | https://juejin.cn/post/6844903874927525902 在这篇文章,我们继续有关Redis方面知识的学习,一起了解一下其中一个非常重要的内容: ...

最新文章

  1. R语言层次聚类模型示例
  2. HDU 3308 线段树求区间最长连续上升子序列长度
  3. 在CentOS6.5上安装Tomcat7
  4. 惠普打印机怎么无线连接电脑_惠普SPECTRE X360 13笔记本电脑怎么样,值得买吗
  5. HTML悬浮音乐播放器源码 自带后台
  6. 蚂蚁金服 AntV F2 3.6 发布,更强!更快!
  7. 了解 XSS 攻击原理
  8. 代码安全 | 什么是OWASP?OWASP十大漏洞解析
  9. 如何实现业务流程集成
  10. 不想安装环境,我如何与前端工程师远程协作开发?
  11. 坐标转换中的七参数详谈
  12. USB3.2超高速协议规范
  13. 科研小助手PubMed的插件PubMedy
  14. 通信算法之六十:SC_FDE系统的物理层算法设计与工程实现
  15. pythonmatplotlib绘图小提琴_python 箱线图和小提琴图
  16. iOS开发除了XCode还需要掌握的8个重要工具,让您开发更容易
  17. Android打电话不一定要申请权限
  18. 概率论(三)- 全概公式逆概公式(贝叶斯公式)
  19. Office PPT 技能培训
  20. 解决“IE图标不见了”问题

热门文章

  1. STM32 USART 波特率计算
  2. VS中常用的环境变量
  3. 范文杰 201421410010 作业2
  4. mybatis 学习五 二级缓存不推荐使用
  5. Eclipse常用插件之Top10
  6. SQL--存储过程+触发器 对比!
  7. 如何对动态创建控件进行验证以及在Ajax环境中的使用
  8. Security+ 学习笔记54 安全政策
  9. LVS详解(五)——LVS NAT模式实战
  10. 计算机网络误区——VLAN中Access和Trunk原理详解