`

Redis 序列之二——Redis的持久化

 
阅读更多

              Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照,默认方式),另一种是Append-only file(aof,文件追加)的方式。

              (一)Snapshotting(快照)

              这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置:

             save 900 1   #900秒内如果超过1个key被修改,则发起快照保存 ;

             save 300 10  #300秒内容如超过10个key被修改,则发起快照保存 ;

             save 60 10000  #60秒内如果发生超过10000个key被修改,则发起快照保存。

           下面介绍详细的快照保存过程:

           1. redis调用fork命令,生成一个子进程。 

           2.父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write),父子进程会共享相同的物理页面,当父进程处理写请求时,os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。 

          3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。

          client也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。

 

            (二) Append-only file(aof,日志追加)

          aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改,不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次):

appendonly  yes  //启用aof持久化方式  

appendfsync always    //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用

appendfsync everysec  //默认方式,每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 

appendfsync no   //完全依赖os,性能最好,但持久化没保证

 

分享到:
评论

相关推荐

    redis开发的概要介绍与分析

    在Redis开发过程中,开发者可以充分利用Redis的内置功能,如复制、Lua脚本、LRU淘汰机制、事务和不同级别的磁盘持久化等。此外,Redis Sentinel和Redis Cluster等高级功能提供了高可用性和可扩展性,使得Redis能够...

    redis-cache:由Redis支持的WordPress持久对象缓存后端。 支持Predis,PhpRedis,Credis,HHVM,复制和群集

    为原始性能重写100%符合WordPress API 更快的序列化和压缩轻松调试和记录缓存预取和分析完全经过单元测试(100%代码覆盖率) 使用TLS的安全连接通过WordPress和WP CLI进行健康检查针对WooCommerce,Jetpack和...

    Java - Redis操作的工具类RedisUtil

    序列化key;查找匹配的key;将当前数据库的 key 移动到给定的数据库 db 当中;移除 key 的过期时间,key 将持久保持;返回 key 的剩余的过期时间;从当前数据库中随机返回一个 key;仅当 newkey 不存在时,将 oldKey...

    Redis 用法

    持久化 ===================================================================================== 数据快照的原理是将整个Redis中存的所有数据遍历一遍存到一个扩展名为rdb的数据文件中。通过SAVE命令可以调用这个...

    resp:Redis RESP协议的读取器,写入器和服务器实现

    RESP是REdis序列化协议的缩写。 虽然该协议是专为Redis设计的,但它可以用于其他客户端-服务器软件项目。 RESP协议的优点是易于阅读,并且具有二进制协议的性能。 特征 和类型,用于从文件,网络或字节流中流式...

    redis缓存技术

    redis是非关系型数据库Nosql的代表,这类数据库主要有以下特点:非关系型的(sql语句对它不起作用,不需要建表存数据,它是直接存储),...如果只使用String类型,redis可以看作加上持久化特性的memcache。##string

    Ractor:基于Redis的分布式actor +用于分布式POCO持久性的Dead简单API

    SE.Redis包装器,具有通用值的自动序列化,默认情况下为JSON.NET。 基于Redis的分布式MPMC RedisQueue和RedisAsyncDictionary,它们共同允许手动构建任何复杂的Actor拓扑,而无需单独的Actor抽象。 具有可靠性...

    caller:自研基于springboot+mybatis+redis+netty 高性能延迟队列

    支持客户端失败重连机制支持服务端访问客户端路由机制支持数据持久化功能支持任务访问失败重连定制化支持访问失败邮件报警功能待增加功能增加页面与用户权限等模块,让使用方更加快捷录入信息增加Redis主从能力增加除...

    RSM:将HTTP会话存储在Redis中

    内部会话表示完全与平台无关,并使用序列化。 这允许在不同类型的服务(例如NodeJS站点和Java REST API)之间共享用户会话。 建造 要构建嵌入了所有依赖项的胖JAR,请运行 ./gradlew shadowJar 配置 Tomcat v8.5 + ...

    Java思维导图xmind文件+导出图片

    图解Redis中的AOF和RDB持久化策略的原理 redis读写分离架构实践 redis哨兵架构及数据丢失问题分析 redis Cluster数据分布算法之Hash slot redis使用常见问题及性能优化思路 redis高可用及高并发实战 缓存击穿...

    Nginx安装包

    与一般数据库不同,redis是使用内存作为主存,而使用硬盘来实现数据持久化,而且redis是周期性的将数据写到硬盘上。这就意味着一旦我们服务器出现断电、重启之类的情况,我们很可能会出现数据丢失的情况,所以不建议...

    Java进阶教程数据层全栈方案SpringData高级应用视频教程

    4.SpringData Redis的序列化器 5.SpringData Redis运行原理分析 6.SpringData Redis常见操作 第七章 Repository和Template的选用 第八章 SpringData ElasticSearch 1.SpringData ElasticSearch简介 2.ElasticSearch...

    bboss:bboss是一个j2ee框架,包括aopioc,mvc,持久性,taglib,rpc,事件,bean-xml可序列化的,redis,kafka,mongodb等。

    bboss集团网站: bboss组项目博客: bboss版本重建方法 gradle安装 开发工程生成方法: dle蚀 Gradle的想法 亦可以直接通过idea或eclipse gradle插件将下载的bboss源码工程导入eclipse或者idea ...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    本内容属于免费分享,如有积分变动请评论联系; 本资源适用于运营商、Java开发校招面试基础巩固,包含...Redis:持久化过程、高可用实现、缓存设计、应用场境等。 所有文档都是md格式,方便阅读,图文并茂便于理解。

    全球软件开发大会2021上海站ppt合集(28个主题共84份).zip

    “缓存+存储”架构下 Redis 持久化的探索与实践 & 云原生数据库的“能与不能”.pdf 下一代前端构建工具 Vite 实践与探索.pdf 与流量赛跑——机票盲盒活动背后的故事.pdf 云原生Serverless数据库的设计与实践 .pdf 云...

    【JeeSpringCloud v3.2.4】后台权限管理系统+互联网云快速开发框架+微服务分布式代码生成

    另外,REST调用也达到了比较高的性能,在基准测试下,HTTP + JSON默认的RPC协议(即TCP + Hessian2二进制序列化)之间只有1.5倍左右的差距,详见下文的基准测试报告。 ORM/Redis/Service仓库 RepositoryORM仓库,...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    RabbitMQ消息持久化 RabbitMQ fanout广播模式 RabbitMQ direct广播模式 RabbitMQ topic细致的消息过滤广播模式 Redis string操作 RabbitMQ rpc实现 Redis hash操作 Redis 集合set 和有序集合操作 Redis 集合操作补充...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 js练习之二级联动 06 jquery以及jquery对象介绍 07 jquery选择器 08 jquery的查找筛选器 09 jquery练习之左侧菜单 第44章 01 jquery属性操作之html,text,val方法 02 jquery循环方法和attr,prop方法 03 jquery...

    Java常见面试题208道.docx

    142.要保证消息持久化成功的条件有哪些? 143.rabbitmq 持久化有什么缺点? 144.rabbitmq 有几种广播类型? 145.rabbitmq 怎么实现延迟消息队列? 146.rabbitmq 集群有什么用? 147.rabbitmq 节点的类型有哪些? 148...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC...

Global site tag (gtag.js) - Google Analytics