MySQL 的事务,有四个比较核心的特性:
Redis
是一个内存数据库,是把数据存在内存中的。内存中的数据并不是持久的,要想能做到持久,就需要让 Redis
把数据存储在硬盘上
Redis
相比于 MySQL
这样的关系型数据库,最明显的有点/优势==>效率高/快
为了保证速度快,数据肯定还得再内存中,但是为了持久,数据还得想办法存储在硬盘上
redis
决定,内存和硬盘上都存数据redis
重启的时候,用来恢复内存中的数据的
这样就既能保证高效,又能通过硬盘恢复数据,保证持久化的效果,代价就是消耗了更多空间(一份数据,存了两遍)(硬盘便宜,不会带来太多成本)RDB
--> Redis DataBase
AOF
--> Append Only FIle
定期的把我们 Redis
内存中的数据,都给写入硬盘中,生成一个“快照”
Redis
给内存中当前存储的这些数据,赶紧拍个照片,生成一个文件,存储在硬盘中Redis
一旦重启了(内存数据就没了),就可以根据刚才的“快照”,把内存中的数据给恢复回来[!quote] 快照 某个案发现场,警察来了之后,会拉上警戒线,然后开始忙碌地拍照,记录现场==>后续就可以根据这些记录的照片,来还原出现场当前发生了什么
“定期”具体又分为两种方式:
Redis
客户端,执行特定的命令,来触发快照生成(save
、bgsave
)Redis
配置文件中,设置一下,让 Redis
每隔多长时间/每产生多少次修改就出发执行 save
的时候,Redis
就会全力以赴的进行“快照生成”操作,此时就会阻塞 Redis
的其他客户端的命令
keys *
的后果save
是在前台,bgsave
(background
)是在后面偷摸进行,不会影响 Redis
服务器处理其他客户端的请求和命令
Redis
可以正常去响应命令Redis
是怎么做到 bgsave
的呢?是不是偷偷搞了个多线程?
Redis
使用的是“多进程”的方式,来完成的并发编程,实现 bgsave
的当 Redis
服务器(父进程)收到 bgsave
的命令之后,首先会进行一个判断
1 . 判定当前是否已经存在其他正在工作的子进程
比如现在已经有一个子进程正在执行 bgsave
,此时就直接把当前的 bgsave
返回
2 . 如果没有其他的工作子进程,就通过 fork
这样的系统调用,创建一个子进程来
fork
是 Linux
系统提供的一个创建子进程的 API
Windows
,创建子进程就不是 fork
(CreatProcess
)fork
创建子进程,简单粗暴,就是直接把当前的进程(父进程)复制一份,作为子进程。一旦复制完成了,父子进程就是两个独立的进程,就格子执行各自的了 redis server
中,有若干变量,保存了一些键值对数据。随着这样的 fork
的进行,子进程的这个内存里也会存在和刚才父进程中一模一样的变量因此,复制出来的“克隆体“(子进程),内存中的数据就是和“本体”(父进程)是一样的。接下来安排子进程去进行“持久化”操作,也就相当于把父进程本体这里的数据给持久化了
父进程打开了一个文件,
fork
了之后,子进程也是可以同时使用这个文件的
如果当前 redis
服务器中存储的数据特别多,内存消耗特别大,此时进行上述的复制操作,是否会有很大的性能开销?
fork
在进行内存拷贝的时候,不是简单无脑的直接把所有的数据都拷贝一遍,而是“写实拷贝”的机制来完成的 在进行 bgsave
这个场景中,绝大部分的内存数据,是不需要进行改变的(整体来说这个过程执行的还挺快,这个短时间内,父进程中不会有大批的内存数据变化)
因此,子进程的“写实拷贝”不会触发很多次,也就保证了整体的“拷贝时间”是可控的,高效的
总结: 创建子进程,子进程完成持久化操作,持久化会把数据写入到新的文件中,然后使用新的文件替换旧的文件
stat
命令,查看文件的 inode
号)redis
生成的 RDB
文件,是放在 redis
的工作目录中的,也是在 redis
配置文件中进行设置的
RDB
机制生成的镜像文件,redis
服务器默认就是开启了 RDB
的redis
服务器重新启动,就会尝试加载这个 RDB
文件,如果发现格式错误,就可能会加载数据失败redis
提供了 RDB
文件的检查工具
当执行生成 RDB
镜像操作的时候,此时就会把要生产的快照数据,先保存到一个临时文件中。当这个快照生成完毕之后,再删除之前的 RDB
文件,把新生成的临时的 RDB
文件名字改成刚才的 dump.rdb
RDB
文件始终只有一个RDB
文件中的数据,不是你这边插入了数据,就会立即更新的
RDB
文件内容 可以发现 RDB
文件内容更新了
RDB
的触发时机:
900s
之后,并且至少存在一次 key
的修改,就会触发自动更新这些数值都是可以自由修改的,但是此处修改数据的时候,有一个基本的原则:
RDB
快照,这个成本较高,不能让这个操作执行太频繁redis
持久化生成快照操作,不仅仅是手动执行命令才出发,也可以自动触发
save
执行 M
时间内,修改 N
次shutdown
命令(redis
里的一个命令)关闭 redis
服务器,也会触发(service redis-server restart
)(正常关闭)redis
进行主从复制的时候,主节点也会自动生成 RDB
快照,然后把 RDB
快照文件内容传输给从节点redis
服务器,此时 redis
服务器会在退出的时候,自动触发生成 RDB
操作kill -9
或者服务器掉电),此时 redis
服务器来不及生成 RDB
,内存中尚未保存到快照中的数据,就会随着重启而丢失RDB
配置,修改完成后需要重启服务器RDB
文件被改坏了,redis
服务器启动不了了,我们可以去看一下日志,查看报错信息redis
提供了 RDB
文件的检查工具,可以先通过检查工具,检查一下 RDB
文件格式是否符合要求
reids
服务器,在 5.0
版本是同一个可执行程序,但是我们可以在运行的时候加上不同选项RDB
文件作为命令行参数,此时就是以检查工具的方式来运行RDB
文件里面有错误redis
在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每 6 小时执行 bgsave
备份,并把 RDB
文件复制到远程机器或者文件系统中(如 hdfs
)用于灾备redis
加载 RDB
恢复数据远远快于 AOF
的方式 RDB
是使用二进制的方式来组织数据,直接把数据读取到内存中,按照字节的格式取出来,放到结构体/对象中即可AOF
是使用文本的方式来组织数据RDB
方式数据没办法做到实时持久化,因为 bgsave
每次运行都要执行 fork
创建子进程,属于重量级操作,频繁执行成本过高RDB
文件使用特定二进制格式保存,redis
版本演进过程中有多个 RDB
版本,兼容性可能有风险 redis
的 RDB
文件,放到新版本的 redis
中不一定能识别如果确实需要有一些“升级版本”的需求,就可以通过写一个程序的方式,直接遍历旧的
redis
中的所有key
,把数据取出来,插入到新的redis
服务器中即可
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有