服务层,实现定时缓存

时间:2012-06-05 06:56:17

标签: c# .net .net-4.0 .net-3.5

所以现在我进入了一个我负责的项目。

我发现中间实现的一部分是服务层缓存。显然,服务层中的这个缓存是为了避免大量调用数据库集群而实现的。如果一台服务器出现故障,服务层将托管在两台服务器上,以提高性能和稳定性。

现在我的问题,或者更确切地说,实现定时缓存的最佳模式是什么?很少更改或更新的对象(如国家/地区等)会被缓存,如果没有重置池,则永远不会真正释放。

因为我们,或者更确切地说是我的前辈,在两台独立的机器上有两个活动服务,我正在考虑实现一个定时缓存。 另一种选择可能是让服务与对方交谈,但当然要考虑到他们不依赖于彼此,这样如果一个人倒下,另一个人就可以正常工作。

现在有12个字典,其中包含缓存的项目。其中大多数很少更新。这些词典驻留在一个不是单例的类中,但实现为单例,因此它只实例化一次。

你如何建议我解决这个有趣的问题以及为什么这样?

3 个答案:

答案 0 :(得分:1)

为什么不使用以下缓存技术之一设置包含一个或多个服务器的缓存集群:

这样你就不用担心运行两个服务做同样的事了。

这两种技术都支持指定大约时间的缓存对象。

E.g:

public void Add(string key, object value, TimeSpan timeout)
{
    //...
}

或者您可以选择无限期缓存它们。

支持Redudancy。但要注意小字体。

AppFabric Redundancy

早在2010年,我写了一些关于AppFabric和NCache的帖子。

两者都提供了一个简单且类似的API来使用。

答案 1 :(得分:1)

MemCached是另一个。 MemCached的目标是分布式体系结构,例如您描述的体系结构。我使用Paul Glavic编写的适配器。他写了帖子here,演示了如何使用它。

Glavs适配器允许您将来从Aspnet缓存到MemCached或AppFabric切换出缓存实现。

适配器还以ICacheProvider的形式提供了一个很好的API:

var data1 = cacheProvider.Get<SomeData>("cache-key", DateTime.Now.AddHours(1), () =>
{
    // With the cache disabled, this data access code is executed every attempt to
    // get this data via the CacheProvider.
    var someData = new SomeData() { SomeText = "cache example1", SomeNumber = 1 };
    return someData;
});

答案 2 :(得分:0)

ASP.Net已经内置了一个非常好的缓存系统。你有没有理由不能使用它?

它支持定时刷新缓存,通过外部事件刷新,它可以配置为使用内存,数据库,单独的缓存服务器,分布式缓存等。应该没有理由让你自己做: - )