你管这破玩意叫 RDB?

DPARSF高级版 vs 基础版怎么选?没有T1数据也能做fMRI分析吗? 本文深度对比了DPARSF高级版与基础版在fMRI分析中的核心差异与适用场景,特别针对无T1数据的情况提供了实战解决方案。高级版依赖T1像实现高精度配准,适合需要精确解剖定位的研究;基础版则无需T1数据,适用于功能连接等相对空间要求不高的分析。文章还提供了版本选择决策树和常见问题解决方案,帮助研究者根据实际需求做出最优选择。 阅读详情

低并发编程

战略上藐视技术,战术上重视技术

本文末有小惊喜


我是个 redis 服务,我马上就要挂了

我已经运行了好几年了,我的内存中存储着好多键值对。

如果我挂了,那样我内存中的数据就全没了。

我得想个办法,时不时把数据复制到硬盘上保存起来。

我把这个伟大的计划,称为持久化计划。

停下手头的工作

我首先想到的最简单的办法,就是先拒绝新来的命令,开始将内存中的数据复制到硬盘。

等拷贝完成后,再开始接受新命令。

这样可以保证我拷贝的时候,没有新来的命令修改内存,也即保证了时点性。

简单说就是,我保存的是某一时刻的 Redis 内存状态。

但这样每次持久化都要阻塞客户端,客户端没法发送新命令,肯定要被骂。

不停止手头的工作

这好办,那我就不停止手头的工作呗,一边接受命令,一边做持久化,如下。

这样效率提高了不少,持久化不再阻塞客户端执行命令了。

但是,你有没有注意到,内存中,某一时刻的数据,只有三种情况:

闪客 18 低并发编程

低兄 18 低并发编程

低兄 18 求三连

而此时硬盘中持久化的数据是:

闪客 18 求三连

它无法表示任何一个时刻的内存数据。

那这样的快照就失去了意义,也即没有保证时点性。

这显然也是不行的。

先复制一份内存

这可咋办呢?

停止手头的工作可以保证时点性,但阻塞了客户端。

不停止手头的工作,虽然不阻塞客户端,但又无法保证时点性。

真令人头大啊。

抓了一会头皮后,我冷静了下来,开始分析。

时点性是必须保证的,否则快照就没有了意义,那就只能尝试将阻塞客户端的时间变短一点了。

之前的阻塞客户端时间,是消耗在持久化,也就是内存拷贝到硬盘这个过程。

优化一下,先从内存中拷贝一份到另一块内存空间,然后再对这块新的内存空间进行持久化。

这样,持久化的过程不耽误客户端命令,同时不受客户端命令影响,保证了时点性。

而阻塞客户端的时间,仅仅是内存与内存之间拷贝一份数据的时间,相比于整个持久化过程,可以忽略不计。

完美!

带着这套完美的方案,我去找我的主人邀功了。

写时复制

我:主人,我做好持久化方案啦!

主人:嗯我看看... 哎呀,把内存复制一份,这个想法很好,但是差了点火候呀,你对操作系统了解的还不够深入。

我:啊,为啥呢?

主人:你想想看,你现在的目的,就是为了让持久化和处理客户端命令的这两个过程所用到的内存空间隔离开,是不是?

我:嗯嗯是的。

主人:对呀,那其实你只需要新建一个进程去做持久化的过程即可,不同进程之间的内存是隔离的,也就是新建一个进程,会将原有进程的内存空间完全拷贝一份新的。

我:啊,那这不是和我自己复制一份内存一样嘛,耗时差不多吧?

主人:我刚刚的图只是给用户的感觉是这样的,实际上,linux 采用了写时复制技术,在 fork 出子进程时并没有立刻将内存进行拷贝,仅仅是拷贝了一份映射关系,让它们暂时指向同一个内存空间。

主人:而当父子进程对这块内存空间进行写操作时,才会真正复制内存,而且是以页为单位。

我:原来如此,也就是说,我可以利用操作系统的进程的写时复制内存的原理,来代替我自己复制全部内存这个方案,因为持久化过程,对内存的写操作想来也不会特别多,大多数值都是不变的,所以这样就提高了效率。

主人:是的,正是如此。

我:妙呀!

我赶紧把方案修改了,要持久化时我就 fork 一个子进程去做这件事,由操作系统的进程内存隔离的特征替我保证时点性,写时复制原理替我保证效率,也就是减少客户端阻塞时间,伪代码大概是这个样子。

void rdbSaveBackground() {
    // 子进程处理(利用了操作系统的写时复制技术)
    if ((childpid = fork()) == 0) {
        // 落盘主方法
        rdbSave();
    }
}

完美!

还没定结构呢

刚刚光顾着想持久化的过程了,还没定写到磁盘中的数据格式呢。

那就定一个呗。

假如我的 Redis 内存只有一条数据,是通过下面的命令写入的:

set dibingfa niubi

那持久化后落到磁盘中的 rdb 文件将会是这个样子。

好了,大功告成,我再也不用担心自己挂了,会有人帮我从持久化文件中恢复我的内存数据的。

但没来得及持久化的,我就不管了。

具体什么时候进行一次持久化,我给主人留了一个配置

save m n

表示 m 秒内数据集存在 n 次修改时,自动触发一次持久化。

主人也可以配置多个这样的配置项。

而我也好心给主人配了个默认的配置项,并写了段注释。

# Save the DB on disk:
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
save 900 1
save 300 10
save 60 10000

我想以主人的英文水平,应该可以读得懂。

好啦,这回真的是大功告成了!

这个破玩意,我给起个名字,就叫 RDB。

没什么特别的含义,其实就是用我的名字作为开头,Redis DB 而已。

后记

rdb 持久化过程,也可以手动触发,即直接输入 bgsave,同自动触发完全一样。

其在 redis 的源码中,叫做 bgsaveCommand 方法。

整个源码非常简单易读,只是干扰项很多罢了。

我将干扰项全部去掉,整理了一份 RDB 源码简洁版,并配上了我魔性的注释,制作了一份精致的小 pdf。

本来想着让大家分享到朋友圈获取,但想想看算了,加我好友(公众号低并发编程-菜单栏-关于),即可获取这个精致的小 PDF。

SAP_SD模块路径及运输功能后台配置简介 后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义传输模式根据实际运输过程运输地理的类型:海运、公路运输、空运后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义发运类型根据实际运输过程运输方式:汽车、卡车、火车、轮船、飞机后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义运输连接点指在运输过程中需要中转的地区可以维护中转地区的停留的时间后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义路径和阶段。 阅读详情

相关推荐

cadence——MOS晶体管I-V特性曲线仿真

MOS晶体管I-V特性曲线仿真 目标:使用cadence绘制晶体管的I-V特性曲线(dc仿真) 流程: 新建原理图,将MOS管的栅极电压设为变量Vg,漏极电压设为变量Vd 打开ADEL,点击Variables——Copy From Cellview添加变量;并选择dc仿真,对Vd进行扫描 以Vg作为参变量进行仿真,点击Tools——Parametric Analysis进行设置 选择漏极电流作为输出,进行仿真即可得到I-V特性曲线 ...

skycmq的博客 1万+

Redis错误之:打开RDB文件保存失败

问题描述 最近在windows系统下进行开发,所以用到的redis也是windows版本的。因为解压之后便直接使用了,并没有修改redis相关配置。导致redis跑了一段时间过后就会报下面的错误。 错误信息 # Background saving error [12784] 20 Oct 10:52:32.091 * 100 changes in 300 seconds. Saving... [12784] 20 Oct 10:52:32.136 * Background saving starte

qq_45065241的博客 1万+

训练AI:从数据收集到模型部署的完整指南

如果你刚开始接触AI,建议先学习一些基础的编程和机器学习知识,还可以使用现成的AI平台和工具来帮助你训练AI模型。在这篇文章中,我们将详细探讨从数据收集到模型部署的完整步骤,并提供一些有用的技巧和工具,以帮助你成功地训练自己的AI模型。在收集数据时,你需要从可靠的数据源(如数据仓库、数据集市、API接口)获取数据,确保数据的准确性和完整性。常用的划分比例是70%的数据集用于训练模型、15%的数据集用于验证模型,5%的数据集用于超参数调整,最后10%的数据集用于测试模型的性能。测试数据集用于测试模型的性能。

a_wsnd的博客 4166

Redis 存储失败

解决办法:用管理员账户运行Redis服务器端。

qq_45193988的博客 921

避免踩坑!杰理AC63蓝牙名修改常见问题及解决方案(含BLE后缀处理)

本文详细解析了杰理AC63蓝牙设备名称修改的全过程,包括基础操作、BLE后缀处理及高级调试技巧。针对蓝牙名修改中的常见问题,提供了实用的解决方案和代码示例,帮助开发者避免踩坑并实现高效定制。

q6r7s8t9的博客 413

ITK-snap进行分割区域标注、三维显示及改变显示颜色

在进行医学图像器官分割时,无论我们是用传统方法还是深度学习,最后肯定要用到手动分割的区域作为金标准来验证我们方法的精度。但是手动标注器官的轮廓是十分耗时的,这里我介绍一个比较简单的标注方法,以肺分割作为例子。 我们使用ITK-snap作为分割标注工具。 当切片间距离比较小时,比如1mm,一个患者的完整HRCT序列通常在200张以上,如果让医生一一进行分割区域标注是非常耗时乏味的。因此,我们可以使用最简单的阈值法比如OSTU,加上基本的形态学操作对肺进行粗分割得到粗略的分割掩码,在此基础上再手动的对分割结果进

u010409517的博客 2万+

Redis在Windows下的坑

今天无聊拖了一个项目玩了一下,其中环境要求就有Redis 虽然有Linux的环境,可是又不想动,直接在个人娱乐电脑上装了一下; win10的系统 一开始架好项目都OK了,一登录的时候Redis报错 这是win10下Redis报错 其实已经是很明显了,但是一开始我只是看了一下项目中的错误,写入错误,一般来说windows单机就是好玩的一般没这样的问题,写入问题没权限也是Linux下容易出现的问题 S...

u010049198的博客 8261

DDD系列 - 第12讲 如何在DDD中实现Query服务(轻量化CQRS)

轻量化CQRS、整合Repository和DAO的优势。

罗小爬的技术宝书 267

【Windows安装redis遇到的巨坑】rdbSave failed in qfork: Permission denied

windows安装redis的时候出现的巨坑

weixin_44712778的博客 1301

Magisk如何针对性隐藏Root避免被检测

Magisk隐藏特征码有两种途径,一种是通过插件,一种是定制源码。插件的方式相对简单,但是使用范围也有限,好处是成本低好上手。定制源码难度大,成本高,好处是稳定,后续也好更新维护。

zhonglunshun的专栏 1万+

【芯片设计- RTL 编译与仿真 1.2 -- Visualizer 常用使用命令】

打开波形后,如果想要看到所有信号的数据,可以点击下图中红框中的按钮,因为默认verdi 默认并不是显示所用信号。如果想统计某一个信号中有多少笔数据时,可以使用 Expression->Edege Count 功能。如下图所示,如果没有打开前导0的功能时,当某一笔数据位0时,只会显示1个0。如果需要将波形的数据导出到文本文件时,可以按照下面步骤进行。打开前导0功能之后,会根据数据位宽来显示对应0的个数。

CodingCos的博客 2049

你管这破玩意叫 RDB

‍‍作者 | 闪客sun来源 | 低并发编程(ID:dibingfa)我是个 redis 服务,我马上就要挂了!我已经运行了好几年了,我的内存中存储着好多键值对。如果我挂了,那样我内存中的...

程序人生的博客 688

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2189

你管这破玩意叫 RDB ?

我是个 redis 服务,我马上就要挂了我已经运行了好几年了,我的内存中存储着好多键值对。如果我挂了,那样我内存中的数据就全没了。我得想个办法,时不时把数据复制到硬盘上保存起来。我把这个伟...

程序员小灰的博客 303

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

图解redis的持久化存储机制 RDB和AOF

redis的持久化存储策略 redis是一个高性能的缓存数据库,既然是缓存,它的数据就是存储在内存中的,如果说服务器断电了, 或者重启了,或者redis宕机了,他的数据就一定会丢失,所以为了解决这个问题,在丢失数据之前就将数据给持久化保存到磁盘,这种持久化技术,就是RDB和AOF 什么是RDB redis Database 的简写,是将redis内存中的数据保存为一个快照文件,类似Jmap的dump堆转储功能,但rdb是时点性的,只能存储某一时刻的快照,不能实时存储,如果单单使用rdb,它的数据就一定会丢

叶新东老师的博客 1344

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Redis的持久化存储机制RDB和AOF

redis的持久化存储策略 redis是一个高性能的缓存数据库,既然是缓存,它的数据就是存储在内存中的,如果说服务器断电了, 或者重启了,或者redis宕机了,他的数据就一定会丢失,所以为了解决这个问题,在丢失数据之前就将数据给持久化保存到磁盘,这种持久化技术,就是RDB和AOF 什么是RDB redis Database 的简写,是将redis内存中的数据保存为一个快照文件,类似Jmap的dump堆转储功能,但rdb是时点性的,只能存储某一时刻的快照,不能实时存储,如果单单使用rdb,它的数据就一定会

ygd185的博客 584

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Redis】RDB和AOF持久化

RDB和AOF

m0_70088010的博客 1344

redis 持久化rdb aof 简介

redis 持久化rdb aof 简介 结合了几篇文章总结如下 1. rdb模式介绍【默认】 rdb方式的持久化是通过快照完成的,当符合一定条件时redsi会自动将内存中的所有数据进行快照并存储到硬盘上。  默认存储在redis根目录的dump.rdb文件中。  rdb是redis默认采用的持久化方式,配置信息在配置文件redis.conf中  定期将内存数据生成快照(即某

天下无敌庞成勇 662

你管这破玩意儿叫 Redis?

如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力。可以说,熟练使用...

weixin_41385912的博客 202

【Redis】Redis 持久化机制 RDB 与 AOF

Redis 提供了 RDB 和 AOF 两种持久化机制。RDB 通过定期快照保存数据,具有恢复快、体积小的特点,但存在数据丢失风险。AOF 记录所有写命令,数据完整性更好,但文件较大且恢复较慢。实际应用中,建议同时开启 AOF(everysec 模式)和周期性 RDB 快照,以兼顾数据安全和性能。生产环境需根据业务需求调整持久化策略,核心系统推荐使用 AOF 确保数据完整性。

silverclayz的技术分享 1101

微服务框架 SpringCloud微服务架构 分布式缓存 41 Redis 持久化 41.1 RDB 持久化【基本使用】

微服务框架 SpringCloud微服务架构 分布式缓存 41 Redis 持久化 41.1 RDB 持久化【基本使用】

代码改变世界 369

记录redis rdb出错导致服务异常

项目部分功能失效: 后台异常日志:只读权限不能写入 ERROR http-nio-80-exec-1 [[dispatcherServlet].log:175] [Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [redis.clients.jedis.exceptions.JedisDataException: READONLY You can't write agai

a290450134的博客 2723

全网最详细之Redis迁移(将Windows Server上的rdb文件迁移到阿里云ECS Ubuntu服务器上并即时生效)

一、查看并进入本地Redis的rdb文件目录 二、查看Ubuntu服务器的Redis数据库所在目录并将rdb文件传入该目录 首先用 whereis redis.conf 这条指令查找redis.conf文件所在位置,然后进入该目录,打开redis.conf,找到这玩意儿 然后,把你的rdb文件就传到这个目录下,至于怎么传,你可以用WinSCP这个贼鸡儿好用的工具(下载地址:h...

大脸猫的博客 1727

Redis学习笔记(九)--rdb快照持久化

持久化方式:即把数据存储在断电后不会丢失的设备中,通常是硬盘。常见的持久化方式:主从:通过从服务器保存和持久化(主服务器往内存写,从服务器往硬盘写),如mongDB的replication sets设置。日志:操作生成相关日志,并通过日志来回复数据。couchDB对于数据内容,不修改,只追加(日志文件一体),则文件本身就是日志,不会丢失数据。下面看redis的持久化方式:1.rdb快照持久化每隔n...

lyztyycode的博客 700

38 张图详解 Redis:核心架构、发布订阅机制、9大数据类型底层原理、RDB和AOF 持久化、高可用架构、性能问题排查和调优

比如,member 存储 “女神 ID”,score 是该女神的经纬度信息。v 是键值对的 value 值,是个 union(联合体),当它的值是 uint64_t、int64_t 或 double 数字类型时,就不再需要额外的存储,这有利于减少内存碎片。Java 的 HashSet 底层是用 HashMap 实现,Sets 的底层数据结构也是用 Hashtable(散列表)实现,散列表的 key 存的是 Sets 集合元素的 value,散列表的 value 则指向 NULL。香肌如雪,罗裳慢解春光泄。

sjkflw121150的博客 892
上一篇: GitHub刷题笔记“封神”!有人靠它连拿5个offer
下一篇: 对不起,你的密码被破解了!
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值