从数据库中序列化和反序列化数据的最快/最佳方式
Fastest/Best way to serialize and deserialize data from database
几个月后我将开始写我的学士论文。虽然我们只是非常粗略地讨论了我论文的主题,但主要问题是这样的:
用C++编写的程序(或多或少是HTTP服务器,但我想这在这里无关紧要(必须执行才能完成任务。该程序有几个实例同时运行,负载均衡器负责在所有实例之间均衡分配http请求。每当程序的代码被更改以增强它或消除错误时,所有实例都必须重新启动。例如,这可能需要长达40分钟的时间。由于有十多个实例在运行,因此重新启动过程最多可能需要一个工作日。这是放慢速度的方法
假定的瓶颈是在启动期间访问数据库以加载所有必要的数据(猜测它将是一个mysql数据库(。团队负责人减少启动过程所需时间的想法是将数据库的内容序列化到一个文件中,并从该文件中读取,而不是从数据库中读取。那将是我的任务。当然,问题是要检查数据库中是否有新数据,而这些数据不在文件中。我想写过程仍然应用于数据库,而不是序列化文件。我的第一个想法是使用apache-frift进行序列化和反序列化,因为我已经使用过它,而且据我所知,它很快(也许我写了一些小的python程序来处理这个问题(。然而,关于这个问题,我有一些基本的问题:
- 从文件读取而不是从数据库读取是一个好的解决方案吗。这有可能节省时间吗
- 节俭在这种情况下工作得好吗,或者有没有更快的序列化/反序列化方法
- 因为我只是在阅读,而不是在写作,所以我不需要注意连贯性,对吧
- 你能推荐一些关于这个话题值得一读的书或网络文学吗
如果我缺少信息,请询问。提前谢谢。我只是想在开始论文之前充分了解情况并做好准备,这就是我问的原因。
问候
Michael
缓存为王
一般建议:缓存是王道,但不要使用文件。
缓存?什么缓存
我所说的缓存当然是一个外部缓存。有很多可用的系统,其中许多系统能够形成一个缓存集群,缓存项目分布在多台机器的RAM中。如果你做得很聪明,那么与研磨数据库的成本相比,序列化/反序列化到内存中的成本将使你的算法大放异彩。除此之外,您还可以获得一些不错的功能,如缓存数据的TTL、即使业务逻辑崩溃也能持续的缓存等等。
一致性如何
因为我只是在阅读,而不是在写作,所以我不需要注意连贯性,对吧?
错了。问题不在于谁写入数据库。这是关于是否有人向数据库写入,这种情况发生的频率,以及您的数据需要多新。
即使您按照问题中的计划将数据缓存到一个文件中,也必须意识到这会产生与原始数据源断开连接的冗余数据重复。因此,你必须回答的真正问题(我不能为你做这件事(是,最佳更新频率应该是多少。你需要在短时间内立即更新吗?一定的时间滞后可以接受吗?
这正是TTL(生存时间(值的用途,您可以将其放入缓存数据中。如果您需要更频繁的更新,请设置一个较短的TTL。如果您可以以较慢的频率进行更新,请相应地设置TTL,或者运行一个执行更新的计划任务/线程/进程。
好的,明白了。现在怎么办
看看Redis,或者"旧定时器"Memcached。你没有说太多关于你的平台,但有Linux和Windows版本可供两者使用(尤其是在Windows上,Redis会给你带来更多乐趣(。
PS:哦,是的,Thrift序列化可以用于序列化部分。
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 在reactor中存储eventHandlers的最佳方式是什么
- 在AVX通道中混洗的最佳方式
- 从 T 创建 std::future 的最佳方式<T>
- C++:使用 std::unique_ptr 访问重载运算符++的最佳方式?
- 对列表列表中的元素进行分组的最佳方式
- 利用 GPU 的最佳方式
- 使用 QT C++过滤大数据的最佳方式
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 在C++中共享键值对的最佳方式
- 为Catch2中的外部文本文件指定路径的最佳方式
- 代表Quarto棋盘游戏棋子的最佳方式
- 等待线程的最佳方式是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 创建控制台菜单C++的最佳方式
- 只显示片段着色器的最佳方式是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?