什么是持久化数据结构?
一、什么是持久化数据结构
持久化存储,其实主要是针对内存数据的,以典型的Redis来说,持久化存储主要有三种方式:
1、RDB
RDB: 保存某个时间点的全量数据快照
触发方式
1. save: 阻塞Redis的服务器进程,直到RDB文件被创建完毕
2. bgsave: fork出子进程来创建RDB文件,不阻塞服务器进程, lastsave 指令可以查看最近的备份时间
3. 根据redis.conf里的save m n配置定时触发(用的是BGSAVE)
4. 主从复制时,主节点自动触发
5. 执行debug relaod命令
6. 执行shutdown且没有开启AOF持久化
2、AOF
AOF: 增量存储命令
触发方式
1. BGREWRITEAOF: 增量追加命令
2. 根据redis.conf里的appendfsync配置定时触发
3. AOF文件重写
3、混合持久化
为解决AOF文件启动加载慢,不利于快速恢复的缺点,RedisV4.0提供了新的持久化方式——混合持久化。
混合持久化的文件内容: [RDB file][AOF tail]
持久化过程:
1. 将重写(rewrite)这一刻之前的数据做RDB快照处理
2. 将RDB快照内容和AOF增量命令先后写入新的AOF临时文件
3. 重写完成后,对AOF临时文件改名,并覆盖旧的AOF文件
在redis重启的时候,可以先加载RDB文件,然后再重放增量的AOF日志就可以完全替代之前的AOF全量文件重放,因此能大幅提高重启效率提高。
延伸阅读:
二、可持久化实际应用
1.几何计算
在几何计算中有许多离线算法,例如悬线扫描法,其基本策略是一次扫描后给出所有询问的回答,在时间复杂度分析相当优异。但在强迫在线的情况下,每次都要进行一次悬线扫描,询问操作的时间复杂度就从对数时间降为线性。
为了解决时间复杂度上的问题,在这里可以引入可持久化的思维。我们将扫描线的时间轴作为一个变动依据,持久化相关的结构,只要我们能将询问在对数时间内穿梭于这个时间轴,必能动态解决先前的问题。
2.字串处理
为了达到非常高效率的合并操作,防止大量重复性字串的生成伴随的效能退化,使得各方面的操作都能远低于线性操作。如C++中的rope就是一个可持久化的数据结构。不只是字串操作。若处理类型有大量重复操作,均可以考虑将数据结构进行可持久化处理,以达到压缩时间开支的效果。
3.版本回溯
实际上就是对应大部分的应用软体中的redo/undo。如果资料库/操作变动为了高效率操作而会配上复杂的结构(并不像 hash, set 反转操作只需要常数或对数时间),那么为了快速回推变动结果,持久化结构就是要减少 redo/undo 的花费。
资料库本身可以常数回推,纪录变动的部分情况即可。而应用层的计算,大部分实作都是砍掉快取,并且重新计算出一份新的结构,有时候回推的变动大小为 m,为了重新计算结构而消耗了 n + m n+mn+m,如果 n nn 和 m mm 的差距非常大,那连续回推的体感就很糟糕。

猜你喜欢LIKE
相关推荐HOT
更多>>
为什么要学IO模型?
一、要学IO模型的原因1、理解应用程序性能IO操作是网络应用程序中的关键部分,它涉及数据的输入和输出。了解不同的IO模型可以帮助开发人员更好...详情>>
2023-10-15 20:56:04
网站域名有www没有www区别?
一、网站域名有www没有www区别区别:主机记录也就是域名前缀不同,以aliyun.com为例网站域名带www:域名前缀为www,解析后的域名为www.iyun.com...详情>>
2023-10-15 17:02:21
gulp与webpack的区别?
一、gulp与webpack的区别gulpgulp强调的是前端开发的工作流程,我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并、雪碧图...详情>>
2023-10-15 14:45:09
insmod 和 modprobe有什么区别?
一、insmod 和 modprobe的区别insmod和modprobe都是在Linux系统中加载内核模块的命令,它们之间的区别如下:1、命令格式不同insmod命令的语法格...详情>>
2023-10-15 14:09:11热门推荐
网站间隙性502怎么解决?
沸Python中动态编译函数compile参数filename的作用是什么?
热Mysql为什么只能支持2000w左右的数据量?
热为什么使用红黑树以及如何使用红黑树?
新HBase、TiDB、TDengine有什么优势?
为什么要学IO模型?
python中 from…import… 、from…import * 与import的区别?
AliSQL和OceanBase是什么关系?
APP开发的核心是什么?
什么是Sanity check,其作用是什么?
什么是Binder?
web前端开发学习路线?
Android开发手机APP软件需要做哪些准备?
网站域名有www没有www区别?
技术干货






