C#架构建议:在结构中缓存数据的方法?
我想就C#中可行的体系结构征求您的专家意见 我有一个C#服务,它响应局域网上本地用户的请求,从internet获取数据包,并处理这些数据以生成结构中的数据数组。每个数据请求大约需要2秒钟,返回4000字节。每天可能有成千上万的请求 为了加快速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问能够立即提供给LAN上的任何其他用户(可能有超过50个用户) 限制条件:C#架构建议:在结构中缓存数据的方法?,c#,caching,memcached,wcf,C#,Caching,Memcached,Wcf,我想就C#中可行的体系结构征求您的专家意见 我有一个C#服务,它响应局域网上本地用户的请求,从internet获取数据包,并处理这些数据以生成结构中的数据数组。每个数据请求大约需要2秒钟,返回4000字节。每天可能有成千上万的请求 为了加快速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问能够立即提供给LAN上的任何其他用户(可能有超过50个用户) 限制条件: 底层数据永远不会改变,也就是说,我不必担心“脏”数据(太好了!) 我想要缓存的数据是一个相当复杂的结构,包含DateTime
我对您的专家意见很感兴趣。如何:使用IIS提供的内部方法?可能类似Index4Objects ()
另外,请阅读对另一个SO问题的回答。到目前为止,最简单的解决方法是使用
字典
关于您的要求:
缓存的生存期是最容易管理的,因为它有一个后台线程,每10分钟或大约一小时扫描一次缓存。使用ComplexDataStructure
,您可以在创建缓存时存储DateTime
,并在密钥的生存期到期后从字典中删除密钥
因为您存储的是实际的数据结构,所以复杂性不是问题
限制尺寸可能很困难。可以帮助您计算对象结构的大小。此操作不会很简单,但您可以使用ComplexDataStructure
存储结果。然后,使用与1相同的线程。空间不足时可以删除条目。一个更简单的解决方案可能是使用GC.GetTotalMemory()
,并确定进程的总内存使用量是否超出特定限制。然后,只需删除一个缓存项,在第二次运行时,当您看到仍在使用太多内存时,删除第二个缓存项
只要用一根绳子
使用字典
可能是最快的方式
同样,使用1中的线程。实现这样的逻辑
确保正确处理锁定策略。这里最大的问题是,当另一个线程已经在处理数据时,您不希望进行处理。解决这一问题的方法可以是以下策略:
锁定字典
验证缓存项是否存在
当缓存项不存在时:
创建一个空的缓存项
把它加到字典里
锁定缓存项
释放字典上的锁
进行数据处理
将压缩后的数据添加到缓存项中
释放缓存项上的锁
还有其他一些问题需要解决,但我认为这里介绍了基本知识。我认为我已经找到了完美的解决方案:PostSharp+Kellerman.NET日志库。PostSharp需要一个轻微的学习曲线(大约15分钟),但一旦启动并运行,您可以使用属性[Cacable]注释您的方法,系统将自动为您缓存此方法的结果。这是一个尽可能干净的解决方案。对不起,我的问题不够清楚:我必须缓存本地数据,这些数据包含在用C#编写的服务类的结构中。为了让问题更清楚,我已经回避了。回答得很好,谢谢。我没有亲自实现,而是使用了Kellerman提供的现成解决方案.NET缓存库。