什么是在ASP.NET Web服务器数据库支持,内存驻留全局缓存的最佳地点?(What's

2019-09-01 19:59发布

我有缓存在内存中出于性能的考虑对象层次,它反映的列(对象ID,ParentObjectID,时间戳)和视图CurrentObjectHierarchy一个简单的数据库表。 我查询CurrentObjectHierarchy并使用哈希表来缓存每个对象当前的父母迅速查找父对象ID,给定任意对象ID。 查询数据库中的表和构建缓存是平均77ms操作,只有当我的数据库API调用方法时,将更改层级(添加/删除/重排根的对象)出现理想这个刷新。

哪里是这样的高速缓存最好的地方,如果它必须由多个ASP.NET Web应用程序进行访问,在不同的应用程序池可能会运行?

本来,我是存储在由不同的Web应用程序共享一个C#DLL中的静态变量缓存。 这个问题,当然是,虽然静态变量可以跨线程访问,它们不能被跨进程访问,这是当多个web-app参与(在单独的应用程序池可能运行)中的问题。 其结果是...同步,线程安全的修改在一个应用程序中的对象层次缓存不会反映在其他应用程序,即使它们使用相同的代码库。

所以,我需要这个缓存更具全球性的位置。 我不能用静态变量(如我刚才解释),会话状态(这基本上是每个用户存储),和应用程序状态(需要在整个应用程序访问)。

我一直在考虑可能的地方是:

  • 某种IIS本身全局对象存储,在任何应用程序池中的任何应用程序的任何线程(如果这样一个地方存在,是吗?)
  • 管理专用高速缓存的独立,定制的web服务。

现在,我认为最好的办法是SQL CLR集成 ,这是因为:

  • 我可以使用静态变量保持我目前的设计
  • 这是一个已经存在一个单独的服务,所以我没有写一个自定义
  • 它将在一个单一的过程(SQL Server)的运行,因此现有的基于锁的同步将正常工作
  • 高速缓存将被设置为尽可能地接近它代表了数据结构!

我会嵌入到SQL CLR DLL层次穿越方法,让我可以做一个单一的SQL调用,我通常会做一个普通的方法调用。 这一切都依赖于SQL Server中的一个进程中运行和CLR被加载到这个过程中,我认为是这样的。 你觉得这怎么样? 你能看到什么明显的错误有这种想法,我可能会丢失? 这难道不是一个真棒想法?

编辑:寻找更紧密后,似乎不同的ASP.NET应用程序实际上是在同一个进程中运行,但应用程序域隔离。 如果我能找到一种方法来共享和同步跨应用程序域的数据,那将是非常非常有用的。 我在阅读有关.NET远程现在。

Answer 1:

微软正在开发一种分布式缓存框架: 速度 。 然而,最新的版本是一个CTP3版本,所以它可能不是生产做好准备...



文章来源: What's the best place for a database-backed, memory-resident global cache in an ASP.NET web server?