c++编程实践——历史记录的管理

一、历史记录管理

有过电脑操作使用的人都会遇到过这种问题,比如打开一个文档处理软件(如Word),对某个文件进行了很多的修改,但后来觉得这些修改没用,就可以使用命令或工具栏图标不断的回退,从而回到自己需要的那个文档页面。而开发者在IDE中的操作也很类似。

同样,在某些日志的处理中,也需要以不同的条件进行日志的查询(如逐条或逐页等等),这都需要对历史的操作有一个管理。

如果这些记录很少或数据量不大,尚还不会出现一些问题。但当把这些历史记录抽象到一个复杂的层面时,需要应对各种复杂的历史记录管理并且数据量很大时,问题就会出现。即数据如何保存、如何保证处理的效率等等。其实最终的目的都是让历史记录能够真正的为实际所用。

二、解决方法

其实在经历了前面的很多内存和任务管理的相关内容实践和分析后,对待这个问题,并没有什么难度。其主要的思路不外乎根据实际的需求,是否需要长期保存还是只在当次保存。历史的记录是否允许压缩、查询的速度要求等等。在确定这些整体问题后,再利用前面分析过的内存管理的策略和方法等进行细节上的分层控制。

下面对其对行一个全面的说明:

  1. 单次保存
    这种很好理解,就如前面提到的只在本次文档修改有效,关闭文档后,历史记录自动抛弃。而这种情况对响应速度和历史记录查看便捷要求较高。所以可以考虑只在内存中创建
  2. 反复使用
    这个问题就比如日志,可能需要反复的查询、分析。软件是否存在与其没有必然的联系,这可能就需要落盘到硬盘当中去。而硬盘落盘,也有很多方法和策略,用来提高效率和容错度
  3. 综合应用
    而在互联网的应用中,可能会遇到既要求响应速度和效率(比如在线活动的用户信息),又需要长期保存历史数据(非在线的用户信息)的完整性的需要,比如所有用户的画像数据。这就必须把内存与硬盘保存结合起来,实现历史数据的有效利用

下面将针对内存单独应用和综合应用进行具体的分析说明。

三、内存管理

如果单纯使用内存操作,其实其基础就是大家学习的"内存管理"技术。主要包括以下技术点:

  1. 内存的大小限制
    内存的大小数量可以直接限定死,也可以灵活的采用动态处理的方法。但一般可以考虑使用类似于网络中的"滑动窗口"机制,既保证了数据的数量整体受限,又可以保证数据的有效性,管理操作也便于实现。
  2. 合理数据结构的设计
    其实在内存相关的管理分析中,就知道了内存管理中数据结构的设计非常重要,是采用连续的数据块还是非连续的链表方式,或者根据情况将二者结合起来。总之一点,就是尽可能以最小的代价实现历史数据的管理操作
  3. 内存数据的替换策略
    在面对一些具体场景需要有数据优先级或特定的数据更新替换时,需要选择合适的替换策略,如在内存管理中常用到的先进先出,后进先出,最少使用等等
  4. 内存数据的压缩
    在面对较大数据量时,如何选择正确的数据压缩保证以最小的内存量实现最大化的历史数据存储管理,非常重要。它既可以降低成本,又可以提高内存应用的效率
  5. 整体控制
    除了上面的内存控制,还需要考虑实际运行时的动态调整。即需要有一定的方法对内存的应用进行监视、反馈和调整。最重要的一条是要保证数据的可靠性和完整性

可以这样认为,在单纯的内存历史数据管理中,只要场景需要,内存管理的所有的技术方法都可以选择应用进来。同时,还需要考虑实际场景的具体的动态情况,进行动态调整和规范。

四、内存和硬盘综合管理

正如前面分析,在实际的应用场景中,不少的情况可能需要内存和硬盘二者结合起来。典型的就是电商应用。使用Redis等内存型数据库和MySql等数据库一起达到历史记录的保存。从目前的实践经验来看,其效果还是不错的。但就本文而言,还没有复杂到那种地步,一般可以自己实现内存与硬盘结合的历史数据处理。其技术点主要包括:

  1. 内存与硬盘的数据存储机制
    可以根据实际的应用场景来划定内存和硬盘的存储机制,利用分层的方法,有效的实现内存与硬盘的数据形成一个安全、高效的分级处理过程。比如常用数据要加载到内存、不常用的要保存在硬盘
  2. 内存与硬盘的数据处理策略
    为了提高历史记录数据的读写操作效率,一般都采用异步通信机制进行管理。这就需要对历史记录的存储或通信数据结构进行相关的属性设置如时间戳、记录ID等等
  3. 二者的交互机制
    其实就是保证内存和硬盘中的数据可以最大效率的安全进行数据交互,比如是否需要缓存、建立统一的ID、数据是否分块(Hash)等等
  4. 二者的数据一致性
    这一点是最根本的,要确保二者的数据的一致性。不管是严格一致还是最终一致。所以在处理内存与硬盘中历史记录的增加、修改和删除时要有相关的一致性算法和策略进行保障。最简单的就是使用锁。当然,在很多种情况下还需要使用其它的一致性方式

历史记录数据,其实放大了,就是互联网那一套。什么分布式管理、分布式下的数据一致性。但本文只是针对于单机中的特定的环境的实现。如果直接上那一套,太不划算且过于复杂。所以还是得有自己的一套方法来应对解决这种情况。

五、总结

最近的项目中就出现了这个问题,使用内存又无法保障数据的长期完整性,而数据库成本又高。实际情况中数据量也并不是太大,所以还是考虑实现了相关的一套历史记录的管理方式并在本文对设计的思路进行了整理说明。

相关推荐
玖笙&4 小时前
✨WPF编程基础【3.3】:容器控件(附源码)
c++·wpf·visual studio
汉克老师5 小时前
GESP5级C++考试语法知识(十七、二分算法提高篇(二))
c++·算法·二分算法·gesp5级·gesp五级·二分算法易错点
我材不敲代码5 小时前
Python 正则表达式进阶实战:从文本清洗到复杂信息提取
c++·python·正则表达式
我命由我123456 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
计算机安禾6 小时前
【c++面向对象编程】第48篇:Lambda表达式与std::function:OOP中的函数式编程
java·c++·算法
chxin140166 小时前
CMake 笔记
c++
C+-C资深大佬7 小时前
在C++中,const和#define有什么区别?
开发语言·c++
春蕾夏荷_7282977258 小时前
MFC 简易成绩管理界面
c++·mfc·成绩
weixin_421725268 小时前
C语言、C++与C#深度研究报告:从底层控制到现代企业级开发的演进
c语言·c++·c·内存管理·编译模型