首页 编程语言 .net环境下跨进程、高频率读写数据

.net环境下跨进程、高频率读写数据

一、需求背景

1、最近项目要求高频次地读写数据,数据量也不是很大,多表总共加起来在百万条上下。

单表最大的也在25万左右,历史数据表因为不涉及所以不用考虑,

难点在于这个规模的热点数据,变化非常频繁。

数据来源于一些检测设备的采集数据,一些大表,有可能在极短时间内(如几秒钟)可能大部分都会变化,

而且主程序也有一些后台服务需要不断轮询、读写某种类型的设备,所以要求信息交互时间尽可能短。

 

2、之前的解决方案是把所有热点数据,统一加载到共享内存里边,到也能够支撑的住(毫秒级的),但是由于系统架构升级,之前的程序(20年前的)不能兼容。

只能重新写一个,最先想到的是用redis,当时把所有API重写完成后,测试发现效率不行,是的,你没有看错,redis也是有使用范围的。

 

3、redis读写非常快,但是对于大批量读写操作我觉得支持不够,虽然redis支持批量读写,但是效率还是不够快,

对于字符串(string)类型的批量读写,我测试过;效率比较好的在每批次200 至 250条之间,处理20万条数据耗时5秒左右, (PC机,8G,4核)

而对于有序集合(sorted set)类型,批量写的操作用起来非常别扭,而且没有修改API(如有其他方式请指教),我测试过,效率没string类型那么高

其他类型不适合我的业务场景,就没考虑使用了

 

4、所以项目组最后决定还是用回共享内存,先决定在.net环境下使用c#的共享内存,这个功能可能使用的人不多,其实在.net4.0版本就已经集成进来了

在System.IO.MemoryMappedFile命名空间下。这个类库让人很无语,因为里边能用的只有Write、Read这2种方法,而且只是针对字节的操作

需要非常多的类型转换,非常麻烦!想想,只能以字节为单位去构建一个需要存放百万级数据的内存数据库,得多麻烦?

需要手动搞定索引功能,因为要支持各种查询,最后花了一天的时间写完DEMO,最后测试后发现效率并没有很大提高,因为当时加了互斥量测试,

但是离毫秒级差得远。这个技术点有兴趣的可以了解下,园子里有,如:https://www.cnblogs.com/zeroone/archive/2012/04/18/2454776.html

 

二、没错,第一节写的太多了

1、最后分析,这应该是c#语言的瓶颈,c#对于这种骚操作是不那么成熟的。

2、最后瞄来瞄去,决定使用VC开发一个dll,在里边封装对内存数据的读写功能,然后c#调用

3、本人的C、C++不那么熟、参考了一些实例,比如园子里的:http://www.cnblogs.com/cwbcwb505/archive/2008/12/08/1350505.html

4、是的,你没有看错,2008年的,我还看到一篇更早的,看来底层开发C、C++那么经久不衰不是没有道理的,很多技术现在都在用

5、看看什么是共享内存

 

 

三、开始写代码了

1、首先建2个控制台项目,支持MFC,

2、先这样:一个负责创建共享内存,初始化数据

3、再这样:一个读写数据测试,最后修改

4、最后修改下图片细节,测试一下,看看效果


站心网

一、需求背景1、最近项目要求高频次地读写数据,数据量也不是很大,多表总共加起来在百万条上下。单表最大..

为您推荐

ASP.Net Core WebApi几种版本控制对比

一、版本控制的好处:(1)有助于及时推出功能, 而不会破坏现有系统。(2)它还可以帮助为选定的客户提供额外的功能。API 版本控制可以采用不同的方式进行控制,方法如下:(1)在URL 中追加版本或作为查询字符串参..

.NET CORE 设置cookie以及获取cookie

使用我这个方式的前提是在mvc中,确认你安装了:Microsoft.AspNetCore.Mvc.然后在继承了Controller的类型中使用我所说的方法。直接使用即可,我是封装了方法供我自己使用,代码如下: public abstract class Control..

实时数据的处理一致性如何保证?

实时数据一致性的定义以及面临的挑战数据一致性通常指的是数据在整个系统或多个系统中保持准确、可靠和同步的状态。在实时数据处理中,一致性包括但不限于数据的准确性、完整性、时效性和顺序性。下图是典型的实时/..

关于大数据的一些真知灼见

大数据很强大,但还是有很多人仍然不知道它到底是什么。让我们来学习大数据的真实表现,以及如何更好地促进企业转型。或许我们经常听到有人讲大数据,但仍然有很多人不知道它到底是什么。因为我确信它很强大,所以我..

配置不同环境下启用swagger,在生产环境关闭swagger

前言Swagger使用起来简单方便,几乎所有的API接口文档都采用swagger了。使用示例:http://www.cnblogs.com/woshimrf/p/swagger.html, 现在开发中可以参考文档,但生产环境并不想暴露出去。配置只要在不同环境中配置..

工作中人们常提到的数据预处理,说的到底是什么?

数据预处理一方面是为了提高数据的质量,另一方面也是为了适应所做数据分析的软件或者方法。在做数据分析时,我想许多数据分析师会像《R语言实战第二版》的作者卡巴科弗那样发出感叹:“数据分析师在数据预处理上花..

记录荒废了三年的四年.net开发的第一次面试

对象身在成都小微企业,前两天面试深圳老牌金蝶公司。对我这个荒废了三年光影的人来说,怎一个跨度之大了得?作为人我生第一次面试的,整个面试过程,只能用诡异来形容这次感受。而结尾也是迷迷糊糊中草草收场。不是..

记录荒废了三年的四年.net开发的第二次面试

这次面试的是小公司,深圳计通智能,面试分为初试和复试。使用腾讯视频会议完成。相比与上次面试,这次有所进步,进复试了。当然,这可能也与面试风格有关。这次面试着重与项目经历和技术,因此回答比较顺畅。这一周..

mysql随机获取一条或者多条数据

语句一:select * from users order by rand() LIMIT 1MYSQL手册里面针对RAND()的提示大概意思就是,在 ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低,效率不行,切..

多语言网站数据库文章表设计

设计一个支持多语言的网站数据库时,应该确保内容能够方便地扩展和管理。以下是多语言数据库表设计的关键原则和示例:设计原则分离内容与语言:将与语言相关的内容独立存储,不直接硬编码到主要表中。每个支持多语言..

ASP.NET 使用Entity Framework (EF) 创建迁移修改SQLite数据库表结构

在 ASP.NET 中,使用 Entity Framework (EF) 创建并连接 SQLite 数据库是一种轻量级、高效的数据库管理方式。以下是详细步骤:安装必要的 NuGet 包安装EntityFrameworkCore.Sqlite包:Install-Package Microsoft.Ent..

Mysql查询一段时间内的数据

select * from wap_content where week(created_at) = week(now)如果你要严格要求是某一年的,那可以这样查询一天:select * from table where to_days(column_time) = to_days(now());select * from table where da..

在Docker、Kubernetes环境下部署.NET应用的最佳实践

在 Docker 和 Kubernetes 环境中部署 .NET 应用是现代云原生开发的重要实践之一。以下是一些经过验证的最佳实践,涵盖 Docker 镜像优化、Kubernetes 部署配置和整体架构建议。1. Docker 镜像构建的最佳实践1.1 使用..

SQLite性能支持多少数据量?

SQLite是一种轻量级的关系型数据库管理系统,广泛应用于移动应用、嵌入式系统和小型桌面应用程序中。由于其零配置、自给自足的特性,SQLite在很多场景下非常受欢迎。然而,对于许多开发者来说,一个常见的问题是:SQ..

Sylvan.Data.Excel 性能优异的开源.NET Excel数据读取库

Sylvan.Data.Excel是一个开源、免费、跨平台的.NET库,专注于读取和写入Excel数据文件。支持多种文件格式,并提供高效的数据访问和数据绑定功能。该库在.NET生态系统中是读取Excel数据文件的最快且内存分配最低的库..

HTQL 提取和查询HTML和XML数据的轻量级查询语言

HTQL(Hyper-Text Query Language)是一种用于提取和查询HTML和XML数据的轻量级查询语言。HTQL提供类似SQL的语法,可以方便地从网页或其他基于标签的文档中提取结构化数据,而无需解析整个文档。这使得它在爬虫、数..

使用ADO.NET连接到南大通用GBase 8s数据库

南大通用GBase 8s数据库广泛应用于各种企业级应用中,对于开发者而言,掌握如何使用ADO.NET连接到GBase 8s数据库非常重要。本文将详细阐述如何通过ADO.NET方式连接到南大通用GBase 8s数据库,并进行基本的数据库操作..

MySQL 5.x和MySQL 8.x数据库的区别

MySQL 是开源关系型数据库的代表,广泛应用于不同规模的 Web 和企业应用中。从 MySQL 5.x 到 MySQL 8.x 的升级带来了大量功能改进和性能提升。为了帮助大家更直观地理解两者的区别,本文将通过详细介绍并结合实际的 ..

Redis 同步、击穿、穿透及雪崩简述

对Redis最常见的几个问题,简要的说下我的理解与解决方法。数据同步指Redis做为缓存,在数据变化时,怎么保持与数据库数据同步的。一般解决方案为:缓存双删(同步方案大都采用删除缓存,而不会更新新缓存。缓存击穿..

数据库SQL Server2014和SQL Server2019的区别和如何选择?

SQL Server 2014和SQL Server 2019是微软公司发布的两个版本的数据库管理系统,它们在性能、安全性以及可扩展性等方面各有特点。在选择这两个数据库版本时,需要根据系统需求、预算状况以及技术团队的熟悉程度等因素..

发表回复

返回顶部