Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。

1、RDB
保存数据快照至一个RDB文件中,用于持久化。RDB操作和Mysql Dump相似。

1.1 执行方式

  • save。同步操作,会阻塞Redis。
  • bgsave。调用linux的fork(),然后使用新的线程执行复制。但是fork期间也会阻塞Redis,但是阻塞时间通常很短。
  • 自动保存。Redis配置文件中设置了自动保存的触发机制,可以自定义修改,运行原理同bgsave。

save和bgsave的对比

注意:

  • 如果机器上运行多个Redis,需要配置RDB文件名称,否则多个Redis的RDB文件会相互覆盖。

除了上述三种执行方式,以下情况也会生成RDB文件:

  • 主从的全量复制时,主机会生成RDB文件。
  • Redis中的debug reload提供debug级别的重启,不清空内存的一种重启,这种方式也会触发RDB文件的生成。
  • 执行shutdown时,会触发RDB文件的生成。

RDB的缺点

  • 全量数据存储,耗时。
  • 虽然fork()采用copy-on-write策略,但仍消耗内存
  • 写RDB文件消耗大量IO性能。

2、AOF
采用AOF持久方式时,Redis会把每一个写请求都记录在一个日志文件里,AOF操作和Mysql Binlog相似。通过AOF重写机制减少AOF文件的体积,从而减少恢复时间。

执行方式

  • always。Redis的每条写命令都写入到系统缓冲区,然后每条写命令都使用fsync“写入”硬盘。
  • everysec。过程与always相同,只是fsync的频率为1秒钟一次。这个是Redis默认配置,如果系统宕机,会丢失一秒左右的数据
  • no。由操作系统决定什么时候从系统缓冲区刷新到硬盘。

AOF重写
为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。

AOF重写方式

  • bgrewriteaof(流程与bgsave相似)
  • AOF重写配置(与RDB自动保存相似)

AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务器当前的数据库状态来实现的。

Redis启动时的数据加载

Redis启动数据加载流程:

  1. AOF持久化开启且存在AOF文件时,优先加载AOF文件。
  2. AOF关闭或者AOF文件不存在时,加载RDB文件。
  3. 加载AOF/RDB文件成功后,Redis启动成功。
  4. AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。

3、开发运维中常见的问题

3.1 fork操作
fork()的实际开销就是复制父进程的页表以及给子进程创建一个进程描述符,所以速度一般比较快

内存量越大,耗时越长;物理机相对较快,虚拟机相对较慢。

优化方法

  1. 优先使用物理机或者高效支持fork操作的虚拟化技术

  2. 控制Redis实例最大可用内存maxmemory
  3. 合理配置Linux内存分配策略:vm.overcommit_memory=1。默认值为0,会使Linux在内存分配时,发现不够内存不足时,不会进行分配,进而造成fork阻塞
  4. 降低fork频率。例如放宽AOF重写自动触发时机或者减少不必要的主从全量复制

3.2 进程外开销

  • CPU。RDB和AOF文件生成,属于CPU密集型。不要将Redis进程绑定在某个CPU上,防止单核过载;同时Redis不和CPU密集型应用一起部署。
  • 内存。fork内存开销,copy-on-write。
  • 硬盘。AOF和RDB文件的写入。可以结合iostat和iotop进行分析。

优化方法

  1. 不要和高硬盘负载服务部署在一起:存储服务、消息队列等
  2. 配置no-appendfsync-on-rewrite=yes。这样在AOF重写的期间,不要进行AOF追加操作(主线程只将数据写入缓冲区),可以减少内存的开销。

但如果AOF重写期间,Redis宕机的话,在Linux的系统默认配置下,最多会丢失30s的数据。如果无法忍受数据丢失,no-appendfsync-on-rewrite配置no;如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。

  1. 根据写入量决定磁盘类型:例如ssd
  2. 单机多实例持久化文件目录可以考虑分盘,或者使用类似cgroups机制进行硬盘资源的合理分配

AOF追加阻塞

例如在AOF的everysec策略中,主线程会对比上次fsync的时间,如果距离上次fsync时间超过两秒,就会造成主线程阻塞(等待同步线程同步完成)。

日常开发可以使用info persistence命令,查看历史发生AOF阻塞的次数;然而需要了解AOF追加阻塞的发生时间则需要查看Redis日志。

发送AOF追加阻塞的时候,日志如下:

Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
优化方法(参考其他方面的优化点)

转载:https://www.douban.com/note/733169321/

Redis持久化的原理及优化相关推荐

  1. redis持久化实现原理

    RDB rdb持久化原理: 会涉及到操作系统底层的fork调用,详情查看:https://zhangxueliang.blog.csdn.net/article/details/104076571 会 ...

  2. redis分布式锁原理与实现

    分布式锁原理 分布式锁,是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候, ...

  3. mysql数据库优化面试redis持久化_【大厂面试06期】谈一谈你对Redis持久化的理解?...

    Redis持久化是面试中经常会问到的问题,这里主要通过对以下几个问题进行分析,帮助大家了解Redis持久化的实现原理. 1.Redis持久化是什么? 2.Redis持久化有哪些策略?各自的实现原理是怎 ...

  4. 高性能分布式缓存redis(持久化原理 安全策略 过期删除内存淘汰策略 性能压测 高可用 Redis Cluster)

    redis redis(持久化原理 安全策略 过期删除&内存淘汰策略 性能压测 高可用 Redis Cluster) 1. 持久化原理 1.1 持久化流程(落盘) 1.2 RDB详解 1.2. ...

  5. Redis学习之Redis概述及原理、基本操作及持久化

    一.Redis介绍 Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 它通常被称为数据结构服务 ...

  6. Redis的持久化技术原理及选型

    本文主要是介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案.在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时还会介绍持久化实现的一些原理细节及需要注意的问题.最后,介绍在实际使 ...

  7. Redis的特点持久化的原理及优缺点

    目录: Redis redis适合什么场景? redis持久化介绍 Redis redis的概念: Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结 ...

  8. 查看redis aof内存_Redis持久化问题定位与优化技巧

    今天主要分享继Redis持久化方式RDB.AOF之后的一些常用的Redis问题定位于优化方式.这里主要CPU.内存.磁盘在三个维度去分析问题! Fork操作 当Redis做RDB或AOF重写时,一个必 ...

  9. redis rdb aof区别_聊一聊RDB、AOF在redis持久化里的底层原理

    什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示: 这样做有什么问题呢? 其实,只要稍微有点计算 ...

最新文章

  1. 查看mysql8日志_mysql8 参考手册--通用查询日志
  2. Linux软件安装-----apache安装
  3. 切莫让争执搁浅技术研发
  4. linux系统怎么清理,linux系统怎么清理废物清理
  5. c语言stoi函数源码,一系列相关函数的通用函数(例如std::stoi,std::stof,std::stod等)...
  6. hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能
  7. linux安装php支持redis拓展
  8. 程序员除了编代码,还能做哪些职业规划?
  9. Apache Dubbo集群容错
  10. 【java笔记】缓冲流
  11. DEDECMS安装遇到NO input files specified解决方案
  12. jmeter连接并使用mysql数据库_jmeter连接MySQL数据库,并执行sql
  13. 在一台2010年的老电脑上安装黑群辉dsm5.2并完成外网访问与洗白操作
  14. 学术第一步:搞清楚SCI、EI、ISTP和中文核心期刊的区别
  15. atx和matx机箱_【技嘉Z87评测】强迫症的执拗 同价位ATX与MATX到底咋选(全文)_技嘉 G1.Sniper M5_主板评测-中关村在线...
  16. 【WiFi】WiFi信道(2.4G、5G及5G DFS)及国家码和电话代码和时区对应表
  17. bootmgr is missing错误:首先检查系统分区是否为活动分区
  18. “百亿消费券”之问:为什么是“618”?为何是京东?
  19. 二进制逆向实验——寻找flag
  20. 单片机驱动SD3077时钟芯片

热门文章

  1. mysql 创建定时任务_mysql创建定时任务
  2. Virtual Serial Port Driver虚拟串口vspd v7.2 下载及破解方法
  3. 元宇宙会成为IPv6的拐点吗?
  4. 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了
  5. re:Invent 2020首日发布43项新产品与功能,涵盖新实例、容器、Serverless、机器学习等领域!
  6. “飞天、无影、小蛮驴…”带你走进2020云栖大会
  7. JavaScript 虽火,但不要轻易去追随!
  8. 抓住指针的精髓,才算掌握了 C 语言的灵魂!
  9. 50 岁再次创业:我希望 20 年后还能解 Bug
  10. 你离黑客的距离,就差这 20 个神器了 | 原力计划