服务层,实现定时缓存
Posted
技术标签:
【中文标题】服务层,实现定时缓存【英文标题】:Service layer, implement timed cache 【发布时间】:2012-06-09 05:06:11 【问题描述】:所以现在我进入了一个由我负责的项目。
我发现实现一半的部分是服务层缓存。显然,服务层中的缓存是为了避免对数据库集群进行大量调用。如果一台服务器出现故障,服务层托管在两台服务器上,以确保性能和稳定性。
现在我的问题是,或者更确切地说,实现定时缓存的最佳模式是什么?很少更改或更新的对象(例如国家/地区等)会被缓存,如果池没有被重置,则永远不会真正释放。
因为我们,或者更确切地说是我的前辈,在两台不同的机器上都有两个活动服务,所以我正在考虑实现一个定时缓存。 另一种方法是让服务相互通信,但当然要考虑到它们之间不相互依赖,这样如果一个服务出现故障,另一个服务会正常工作。
目前有 12 个包含缓存项目的词典。其中大部分很少更新。这些字典驻留在一个类中,该类不是单例,而是作为单例实现,因此只实例化一次。
你建议我如何解决这个有趣的问题,为什么要这样?
【问题讨论】:
【参考方案1】:为什么不使用以下缓存技术之一设置由一台或多台服务器组成的缓存集群:
Windows Server AppFabric NCache这样您就不必担心运行两个服务做同样的事情。
这两种技术都支持在指定的时间内缓存对象。
例如:
public void Add(string key, object value, TimeSpan timeout)
//...
或者您可以选择无限期地缓存它们。
支持冗余。但请注意小字。
AppFabric Redundancy
早在 2010 年,我写了一些关于 AppFabric 和 NCache 的帖子。
https://github.com/geersch/AppFabric https://github.com/geersch/NCache两者都提供了一个简单且相似的 API。
【讨论】:
【参考方案2】: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;
);
【讨论】:
【参考方案3】:ASP.Net 已经内置了一个相当不错的缓存系统。你不能使用它有什么原因吗?
支持定时刷新缓存,通过外部事件刷新,可以配置为使用内存、数据库、单独的缓存服务器、分布式缓存等。你应该没有理由自己制作:-)
【讨论】:
我继承了这个项目,所以我不知道他们为什么这样做。我想了解其他有经验的用户可以提供哪些选择以及原因。我之前构建的系统根本不需要太多缓存。当加载一页时,会进行一两次调用,这会导致相同数量的数据库调用。在这里,一个页面加载有时会导致多次调用,而更多的数据库调用会导致大量的数据库调用,我被告知这就是为什么他们使用这种形式的缓存,现在已经实现了。 嗯,缓存的需求取决于您期望的流量。如果这是一个低流量的解决方案,那么在我看来,缓存只会让事情变得复杂。 由于缓存是一种优化技术,您可能希望在没有它的情况下构建解决方案,然后在需要时添加缓存。这样您就不必猜测解决方案的哪些部分性能好坏。以上是关于服务层,实现定时缓存的主要内容,如果未能解决你的问题,请参考以下文章
实体框架和 NHibernate - 缓存仍然是服务层的责任吗?
中通缓存服务平台基于 Kubernetes Operator 的服务化实践