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

C#架构建议:在结构中缓存数据的方法?,c#,caching,memcached,wcf,C#,Caching,Memcached,Wcf,我想就C#中可行的体系结构征求您的专家意见 我有一个C#服务,它响应局域网上本地用户的请求,从internet获取数据包,并处理这些数据以生成结构中的数据数组。每个数据请求大约需要2秒钟,返回4000字节。每天可能有成千上万的请求 为了加快速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问能够立即提供给LAN上的任何其他用户(可能有超过50个用户) 限制条件: 底层数据永远不会改变,也就是说,我不必担心“脏”数据(太好了!) 我想要缓存的数据是一个相当复杂的结构,包含DateTime

我想就C#中可行的体系结构征求您的专家意见

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

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

限制条件:

  • 底层数据永远不会改变,也就是说,我不必担心“脏”数据(太好了!)
  • 我想要缓存的数据是一个相当复杂的结构,包含DateTime、Double等的嵌套数组。使用大量数学运算,从internet提供的数据中处理数据
  • 无论缓存了多少数据,我都不能使用超过100MB的内存(即缓存必须有大小限制)
  • 我不能用数字索引来索引缓存中的数据,我必须用日期(“YYYY-MM-DD”)和唯一的ID字符串(“XXXXXXXX”)组合来索引它
  • 它必须是快速的,也就是说,它必须服务于RAM的大部分响应
  • 缓存中的数据必须每24小时持久化到磁盘
  • 以下是我目前的选择:

  • 使用私有变量(即私有列表或字典)在服务器类中缓存数据,然后偶尔将其序列化到磁盘
  • 使用数据库
    我对您的专家意见很感兴趣。

    如何:使用IIS提供的内部方法?

    可能类似Index4Objects

    ()


    另外,请阅读对另一个SO问题的回答。

    到目前为止,最简单的解决方法是使用
    字典

    关于您的要求:

  • 缓存的生存期是最容易管理的,因为它有一个后台线程,每10分钟或大约一小时扫描一次缓存。使用
    ComplexDataStructure
    ,您可以在创建缓存时存储
    DateTime
    ,并在密钥的生存期到期后从字典中删除密钥

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

  • 限制尺寸可能很困难。可以帮助您计算对象结构的大小。此操作不会很简单,但您可以使用
    ComplexDataStructure
    存储结果。然后,使用与1相同的线程。空间不足时可以删除条目。一个更简单的解决方案可能是使用
    GC.GetTotalMemory()
    ,并确定进程的总内存使用量是否超出特定限制。然后,只需删除一个缓存项,在第二次运行时,当您看到仍在使用太多内存时,删除第二个缓存项

  • 只要用一根绳子

  • 使用
    字典
    可能是最快的方式

  • 同样,使用1中的线程。实现这样的逻辑

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

  • 锁定字典

  • 验证缓存项是否存在

  • 当缓存项不存在时:

  • 创建一个空的缓存项

  • 把它加到字典里

  • 锁定缓存项

  • 释放字典上的锁

  • 进行数据处理

  • 将压缩后的数据添加到缓存项中

  • 释放缓存项上的锁

  • 当缓存项已经存在时

  • 当缓存项实际具有压缩数据时,返回该数据

  • 当缓存项没有经过压缩的数据时,锁定缓存项

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


  • 还有其他一些问题需要解决,但我认为这里介绍了基本知识。

    我认为我已经找到了完美的解决方案:PostSharp+Kellerman.NET日志库。PostSharp需要一个轻微的学习曲线(大约15分钟),但一旦启动并运行,您可以使用属性[Cacable]注释您的方法,系统将自动为您缓存此方法的结果。这是一个尽可能干净的解决方案。

    对不起,我的问题不够清楚:我必须缓存本地数据,这些数据包含在用C#编写的服务类的结构中。为了让问题更清楚,我已经回避了。回答得很好,谢谢。我没有亲自实现,而是使用了Kellerman提供的现成解决方案.NET缓存库。