一个基于共享内存的内存数据库:1 介绍
初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
一、共享内存概述
1.1 什么是共享内存
共享内存是UNIX系统进程间共享信息的最灵活、最高效的方式。
一般实现为同一块物理内存通过IPC函数映射到不同的进程的地址空间,每个进程对共享内存的修改都直接反映到其它进程。共享内存可以在进程终止后持续存在,只要没有用IPC函数删除或关闭主机,共享内存将一直存在。由于多个进程可以同时修改共享内存,因此还需要使用适当的机制进行同步(例如信号量)。
1.2 使用共享内存的好处
在大型业务系统中,对于时间和空间的要求可能同时趋于极限,既要求尽可能高的处理速度,又要求不超出给定的内存需求。实际情况可能是时间和空间都逼近于主机极限。
能够在时间和空间上同时提高性能的手段就是使用共享内存。共享内存是普通内存,访问机制和私有内存相同,因此具有相同的访问效率。共享内存是对进程间共享的,相同的数据只需要在共享内存中存储一份,不需要每个进程一份拷贝,节省了内存空间。共享内存超越进程存在,因此可以一次构造数据然后不断访问,不需要每次都构造,也可以把构造数据的程序和读取数据的程序分开,对于实时系统而言,这是相当关键的特性。
1.3 使用共享内存的难点
使用共享内存的代价是编程复杂度的增加。使用共享内存所需的技术绝不仅仅是几个IPC函数那么简单。
怎样保证多进程修改不冲突?使用一把锁还是多把锁?使用读优先还是写优先?
怎样保证代码版本正确?使用错误格式的程序可能会毁掉数据。
怎样保证系统可靠?任何一个程序的地址访问错误都可能错误涂改共享内存数据。
由于共享内存连接入进程的地址是不确定的,因此一个普通指针存储在共享内存是无意义的,任何使用指针的数据类型都不能存储在共享内存,基本上说,只有基本数据类型int、float、char等和它们的数组可以放入共享内存,通常使用的C++类型string、vector、set、map等等都是无法使用的。
难道需要退回到C时代吗?
本系统的实践表明,使用一些高级编程技巧可以在共享内存中实现标准的STL容器从而极大地减低客户代码的编程复杂度,而经过仔细规划的安全机制可以显著地提高系统可靠性。
本系统使用了大量深度编程技术,部分技巧即使不是独创的也是很少见的。
二、共享内存数据库
2.1 为什么要开发共享内存数据库
首先我已经实现了一整套共享内存基础结构。详见专题共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客。
实现了统一管理的C++基础共享内存容器,包括数组、set集合、字符串压缩存储、LRU队列等,这些全部都是以兼容STL(C++标准模板库)的方式,最大化地利用模版的运行时高效性和STL的功能来解决C++程序员的需要。
但是这些容器的使用必须由C++代码完成,所有数据结构在程序编译后不可修改,不能在程序运行时增加新的结构,对于系统变动频繁的系统来说,这是很不方便的。
为此,开发灵活性和功能上接近大型数据库而性能又远高于大型数据库的内存数据库就存在需求。
2.2 几种主要的内存数据库产品
eXtremeDB,商业软件 并非磁盘数据库的裁剪,而是专门设计的,号称最快、最可靠,并有最全面的接口(包括两种SQL和两种API),多种索引、事件触发、目标日志。
SolidDB,将基于内存和磁盘的全事务处理数据库引擎、载体级高可用性及强大的数据复制功能紧密地融为一体。
Altibase,提供极限性能、容错能力和事务管理的方便性,特别是在通信、网上银行、证券交易、实时应用和嵌入式系统领域。
TimesTen,可作为高速缓存或嵌入式数据库被部署在应用程序层中,它利用标准的 SQL 接口对完全位于物理内存中的数据存储区进行操作。
SQLite,开源软件,小型SQL数据库,最著名的用途是作为应用程序的磁盘文件。并发性很差,是库锁(锁定整个数据库文件)。GPL,不允许用于非开源商业软件。
其他还有H2 database 、Berkeley DB、FastDB、MonetDB等。
总体而言,商业产品提供了高可靠性和并发性,性能远低于定制的共享内存(作为基础技术的Active共享内存就是一种定制共享内存),TimesTen的“Ten”据说就是能够达到磁盘数据库的十倍的意思,而“十倍”对于定制共享内存来说完全可以忽略不计的。
开源软件可靠性、并发性都差一些,但一般速度就更快一点。
这就是完善程度和速度之间的矛盾,每完善一步速度就减低一点。
自行开发的优势就是可以根据自己的需要来掌握完善程度和性能要求的折衷尺度。
2.3 主要设计目标
速度 远高于文件和数据库(低于现在的C++定制结构)
空间 估计高于大型数据库(低于现在的C++定制结构)
实时性 表级备份恢复,意味着实时间歇取决于表的大小
并发性 库、表、记录三级锁定
三种数据类型 整数、浮点数、字符串,不支持NULL
表和索引 无限制,不同表索引名可相同
表的列 无限制
索引 必须包含主键PK,非主键可以重复
创建表 直接定义表结构
创建索引 通过指定索引列实现
函数化查询 给定索引的查询,可查询部分关键字,= > < >= <=
文件备份恢复 全表操作,非记录级 外围功能
SQL支持 简单sql将在较高版本支持,工作量巨大 高级功能
三、运行环境
支持Sun、HP、IBM的UNIX小型机上使用,采用主机自带的C++编译器。需要使用STL。支持Linux,在CenOS和Ubuntu上验证过。
(未完待续)
相关文章:

一个基于共享内存的内存数据库:1 介绍
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
可视化编程 制作在线点名程序,人工和随机生成两种模式
以下是对这段代码的分析: 一、功能概述 这是一个使用 Python 的 Tkinter 库创建的图形用户界面(GUI)应用程序,主要功能是进行在线点名和随机抽奖。可以模拟在一个有六排六列座位布局的场景中进行点名操作和不同规模的随机抽奖。 二、主要函数和变量 窗口设置和变量初始化:…...
pdb在CDB间搬迁 dblink 与rman
create pluggable database <pdb_name> from <pdb_name><dblink> relocate availability max create_file_destxxxxx;-----改变目录 How to relocate a PDB from one CDB to another with minimal down time -12.2 Release (Doc ID 2396518.1) GOAL How to …...
Linux系统中的fork与vfork的区别
目录 一、引言 二、fork与vfork的基本概念 1.fork() 2.vfork() 三、fork与vfork的区别 1.内存分配策略 2.执行顺序 3.性能 4.安全性 四、总结 本文将详细介绍Linux系统中fork与vfork这两个系统调用的区别,帮助读者更好地理解它们在实际编程中的应用。 一、引言…...

特殊类的设计和类型转换
文章目录 特殊类1.请设计一个类,不能被拷贝2. 请设计一个类,只能在堆上创建对象3. 请设计一个类,只能在栈上创建对象 (★)4. 请设计一个类,不能被继承5. 请设计一个类,只能创建一个对象(单例模式…...
ES模块导入、导出学习笔记
ES模块导入、导出学习笔记 1、命名导出、导入1.1、声明时直接导出1.2、先声明,再导出 2、默认导出2.1、声明时直接导出2.2、先声明,再导出 3、命名导出 VS 默认导出3.1、命名导出3.2、默认导出3.3、同时使用 4、使用 as 关键字4.1、在 import 中使用 as4…...

Bagging: 数量,而不是质量。
由 AI 生成:过度简化的树、引导聚合、集成方法、弱学习器、减少方差 集成方法 — 数量,而不是质量 一、说明 机器学习中的集成方法是指组合多个模型以提高预测性能的技术。集成方法背后的基本思想是聚合多个基础模型(通常称为弱学习器&#…...

维信小程序禁止截屏/录屏
一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机: 用户截屏,被禁用 用户录屏,录制的是空白内容/黑色内容的视频。 二、微信小…...

不同大模型代码解释对比
包含ChatGPT,讯飞星火,通义千问,腾讯元宝,智谱清言。 目标是想让大模型解释一个用于预处理人体骨骼关节三维坐标数据样本进行填补空帧的Python函数。 def f_padding_none(data):s data.copy()# print(pad the null frames with…...
Python函数的编写
函数实现 首先,我们来看一个简单的Python函数,它使用os和os.path模块来遍历当前目录及其所有子目录,并列出所有文件的名称。 import os def list_all_files(startpath): """ 列出指定路径(包括其子目录ÿ…...

Linux下的常用命令分享 二(ubuntu 16.04)
1、ls -l的返回值说明 以图中为例,说明对于cc.txt.tar.gz文件,文件拥有者即创建该文件的人可以对该文件进行读写操作,但不能执行该文件,文件组成员用户可以进行读写操作,但不能执行该文件,其他用户只可读&…...

FPGA随记——OSERDESE2和IERDESE2
http://t.csdnimg.cn/yNvxf---看这个篇吧 这个挺好的 OSERDESE2 模块要求复位信号高电平有效,并且 需要将异步复位信号同步到串行时钟域。 除了用原语调用,还可以用High Speed SelectIO Wizard这个IP 进行调用 针对具体select IO这个IP的使用和介绍&…...

Xmind思维导图领衔,三款常备神器助你2024年思维升级!
到了2024年,信息多得让人眼花,新东西学都学不完。要在这么多信息里保持清醒,快速学东西,对大家来说是个考验。好在,科技帮了我们大忙,比如思维导图软件,它们直观又灵活,帮我们提高思…...
SEO服务值得吗?提升销售和营销策略的5种方法
在不久之前,搜索引擎优化(SEO)通常被视为一个独立的实体,企业把提升排名和推动自然流量作为重点。随后,AI登场了,让每个人都忙于弄清“游戏”的新规则,一些公司因此质疑SEO服务是否值得。答案是…...

传统CV算法——角点特征点提取匹配算法实战
harris角点 角点可以是两个边缘的角点;角点是邻域内具有两个主方向的特征点;角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。或者说,角点就是多条轮廓线之间的交点。…...
小米电视使用adb 卸载自带应用教程
小米电视使用ADB(Android Debug Bridge)卸载自带应用的教程如下。请注意,在操作过程中请确保谨慎行事,避免误删系统关键应用导致电视无法正常使用。 准备工作 下载ADB工具: 在电脑上下载ADB工具。ADB是Android Debug …...

编译FFmpeg动态库
编译FFmpeg动态库 环境 macOS High SierraFFmpeg 4.3android-ndk-r21b 编译so库 下载FFmpeg4.3源代码,进入源码目录创建build_android.sh脚本,ffmpeg从4.0起新增了target-osandroid,所以不用再修改configure文件。 注意: ndk…...
yum的基本使用方法
yum(全称 "Yellow dog Updater Modified")是基于RPM包管理器的软件包管理系统,主要用于Fedora和Red Hat系列的Linux发行版中。它允许用户安装、更新、删除以及搜索软件包,并能自动处理软件包之间的依赖关系。下面是一些…...

Nginx+Keepalive集群实战
随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。 Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如果为最前端时单台Nginx会存在单点故障,也就…...

[数据集][目标检测]街道乱放广告牌检测数据集VOC+YOLO格式114张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):114 标注数量(xml文件个数):114 标注数量(txt文件个数):114 标注类别…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...