C# 架构建议:在结构中缓存数据的方法?

2024-03-06

我想请教您有关 C# 可行架构的专家建议。

我有一个 C# 服务,它响应 LAN 上本地用户的请求,从互联网获取数据包,并处理该数据以在结构中生成数据数组。每个数据请求大约需要2秒,返回4000字节。每天可能有数万个请求。

为了加快一切速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问立即提供给 LAN 上的任何其他用户(可能有超过 50 个用户)。

限制条件:

  1. 底层数据永远不会改变,即我不必担心“脏”数据(太棒了!)。
  2. 我想要缓存的数据是一个相当复杂的结构,包含日期时间、双精度数等的嵌套数组。数据是从互联网提供的数据中使用大量数学运算进行处理的。
  3. 无论缓存多少数据,我都不能使用超过 100MB 的内存(即缓存必须有大小限制)。
  4. 我无法通过数字索引对缓存中的数据进行索引,我必须使用日期(“YYYY-MM-DD”)和唯一 ID 字符串(“XXXXXXXX”)的组合对其进行索引。
  5. 它必须很快,即它必须从 RAM 中提供大部分响应。
  6. 缓存中的数据必须每24小时持久化到磁盘。

以下是我目前的选择:

  1. 使用私有变量(即私有列表或字典)将数据缓存在服务器类中,然后偶尔将其序列化到磁盘;
  2. 使用数据库;

我对您的专家意见很感兴趣。


到目前为止,最简单的解决方案是使用Dictionary<string, ComplexDataStructure>为了这。

关于您的要求:

  1. 缓存的生命周期最容易管理,方法是使用后台线程每 10 分钟或一小时左右扫描一次缓存。随着ComplexDataStructure,你存储一个DateTime当创建缓存并在其生命周期到期后从字典中删除该键;

  2. 因为您存储的是实际的数据结构,所以复杂性不是问题;

  3. 限制大小可能很困难。sizeof() 相当于引用类型? https://stackoverflow.com/questions/26570/sizeof-equivalent-for-reference-types可以帮助您计算对象结构的大小。此操作并不简单,但您可以将结果存储为ComplexDataStructure。然后,当空间不足时,与 1. 使用的线程相同的线程可以删除条目。一个更简单的解决方案可能是使用GC.GetTotalMemory()并确定进程的总内存使用量是否超出特定限制。然后,只需删除一个缓存项,然后在第二次运行时,当您发现仍然使用太多内存时,删除第二个;

  4. 只需使用字符串即可;

  5. 使用Dictionary<,>可能是减脂最快的方法;

  6. 再次使用 1. 中的线程并实现此类逻辑。

确保正确处理锁定策略。这里最大的问题是,当另一个线程已经在处理数据时,您不希望进行处理。解决这个问题的方法可能是以下策略:

  1. 锁定词典;

  2. 验证缓存项是否存在;

  3. 当缓存项不存在时:

    1. 创建一个空的缓存项;

    2. 将其添加到字典中;

    3. 对缓存项加锁;

    4. 释放字典上的锁;

    5. 进行数据处理;

    6. 将处理后的数据添加到缓存项中;

    7. 释放缓存项上的锁;

  4. 当缓存项已经存在时;

    1. 当缓存项确实具有经过处理的数据时,返回该数据;

    2. 当缓存项没有被粉碎的数据时,对该缓存项加锁;

    3. 在锁内部,将出现经过处理的数据(因为锁迫使您等待另一个线程)。

还有其他问题需要解决,但我认为这里描述了基础知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 架构建议:在结构中缓存数据的方法? 的相关文章

  • “RouteCollection”不包含“MapMvcAttributeRoutes”的定义

    我尝试使用基于属性的路由 但是当我尝试以下代码片段来激活基于属性的路由时 我收到以下错误消息 RouteCollection 不包含定义 MapMvcAttributeRoutes 这是我的代码 public class RouteConf
  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • C中函数指针的递归声明

    我想声明一个返回指向相同类型函数的指针的函数 我想用它来实现如下状态机 typedef event handler t event handler t event t compilation error event handler t st
  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • 动态选择和更新 LINQ 结果集中的列值

    我有一个场景 其中存在 LINQ 结果集 我使用了以下查询 var stockDetails from d in db BloodBanks where d bbUserName Session username ToString sele
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 函数指针上的未知类型 F TYPE

    include
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 从视图模型调用方法的命令

    好吧 我倾向于避免使用命令 因为它们总是让我感到困惑 但我正在进行一个新项目 并且正在尝试正确构建它 并且在我看来没有任何代码隐藏 基本上我现在想做的就是连接一个按钮来触发一个命令 在我的视图模型上执行一些操作 但不知何故 如此简单的事情仍
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • ASP.NET 网站的自定义登录机制

    我正在开发一个 ASP NET 网站 我需要摆脱一些自定义但简单的登录机制 我从著名的员工信息入门套件 http eisk codeplex com 这是我到目前为止所拥有的 在 ASP NET 页面上 protected void But
  • Facebook Graph Api 2.1 从用户名获取用户 ID

    我正在寻找一个可以从个人资料网址或 Facebook 用户名中提供用户 ID 的解决方案 example http facebook com username 获取此 url 的用户 ID 而且当我尝试读取朋友 我有朋友相关权限 时 我得到
  • Parse.com 关系查询问题

    我有以下表格名称 aniStudii 和 discipline 我也制作了屏幕截图 正如您所看到的 这些表之间在 mateii 列中存在关系 aniStudii 中 Anul I 列的行具有一个值 另一列具有不同的值 这些值可以在 disc
  • JavaScript 乘以 100 给出奇怪的结果[重复]

    这个问题在这里已经有答案了 I have var a 0 0532 var b a 100 b 应该返回 5 32 但它返回 5 319999999999999 我该如何解决 JSFiddle 在这里 http jsfiddle net 9
  • fseek() 函数中的零偏移量与 SEEK_CUR 有什么用?

    while fread product sizeof Product 1 file 1 product price 2 0 fseek file sizeof Product SEEK CUR fwrite product sizeof P
  • 从 package.json 脚本中调用带有参数的 javascript 函数

    javascript 文件 foo js 具有以下内容 function foo param console log foo called with params console log param module exports foo f
  • 编辑后保留PDB文件格式。

    我有 xxx pdb 文件 ATOM 1910 CB SER 128 45 806 50 621 39 840 1 00 9 36 ATOM 1913 OG SER 128 44 538 51 195 39 571 1 00 9 36 AT
  • Given import java util public class Hancock insert code here list add foo 哪两个代码片段独立插入到第 5 行 编译时不会出现警告 选择两项 A public void
  • 将 FILE * 从 Python / ctypes 传递到函数中

    我有一个库函数 用 C 编写 它通过将输出写入到来生成文本FILE 我想用 Python 2 7 x 包装它 并使用创建临时文件或管道的代码 将其传递到函数中 从文件中读取结果 并将其作为 Python 字符串返回 这是一个简化的示例来说明
  • 如何从EF扩展Entity?

    EF 创建的所有实体都是分部类 所以它是可扩展的 假设我有像 Person 这样的实体 partial class Person FirstName LastName 然后我想添加一个计算属性名称 例如 partial class Pers
  • file_get_contents() 用于短网址

    file get contents 不读取短网址数据 例子 http wp me pbZy8 1WM http bit ly d00E2C 请帮我处理这个问题 或者是否有任何 CURL 函数来处理上述链接 这通常工作得很好 如果您发现它没有
  • 密码验证后启动程序

    我需要一些帮助 我在互联网上找到了这个密码程序 它很完美 但是有一个问题 我想做的 一旦验证了密码 启动我制作的另一个程序 另一个程序我制作的是HTA 超文本应用程序 我可以做到这一点吗 这是代码 package components im
  • 每五分钟显示一次 Android 通知

    我想知道如何设置通知时间 我想设置每五分钟通知一次 所以请帮我做到这一点 public class FirstActivity extends Activity private static final int HELLO ID 1 pub
  • Google Oauth - 在哪里登录用户、后端/前端

    使用 Google OAuth 与在应用程序前端登录用户和在应用程序后端登录用户有什么区别 示例 在 React 中登录用户并获取 ID 和身份验证对象 或者让 Node Express 处理一切 过程 重定向并将其存储在数据库中 最常见的
  • 如何使用 Anaconda 的解释器设置 SublimeREPL?

    我喜欢 Sublimetext 中的 Python 但我真正需要的是用于数据探索的交互模式 然而 我一生都无法让 SublimeREPL 使用 Anaconda 的解释器 任何想法 将不胜感激 我已将以下内容添加到我的 SublimeREP
  • 如何获取测量中的条目数

    我是 influxdb 的新手 我刚刚开始阅读流入文档 我似乎无法得到相当于 从表中选择计数 在 influxdb 中工作 我有一个称为购物车的测量 time status cartid 1456116106077429261 0 A 14
  • 通过 javascript/jquery 添加带有 onclick 功能的按钮

    我正在努力寻找通过 javascript jquery 添加带有附加功能的按钮的正确语法 现在我正在尝试 list append
  • FactoryGirl + Faker - 为数据库种子数据中的每个对象生成相同的数据

    我正在使用 FactoryGirl 和 Faker 在我的seeds rb文件 但由于某种原因正在创建完全相同的用户并且rake db seed由于电子邮件唯一性验证而失败 用户工厂 users rb require faker Facto
  • 使用任何 hg Mercurial 命令时出现“错误:root:未找到哈希 md5 代码”

    当尝试使用任何hg在控制台上执行 Mercurial 命令时 我不断收到此错误 我使用 Homebrew 安装了 Python 并且运行的是 Mac OS Catalina v 10 15 1 任何参考将不胜感激 这是我收到的错误 hg c
  • C# 架构建议:在结构中缓存数据的方法?

    我想请教您有关 C 可行架构的专家建议 我有一个 C 服务 它响应 LAN 上本地用户的请求 从互联网获取数据包 并处理该数据以在结构中生成数据数组 每个数据请求大约需要2秒 返回4000字节 每天可能有数万个请求 为了加快一切速度并减少带