我正在考虑创建自己的缓存系统,主要用于C#,但这更多地是一个设计问题,因此语言并不重要。
让我从一开始就开始,我有一个基本的web api,它使用ETag头来检查是否有什么变化。
这是ICachingProvider,它是所有缓存提供程序的基本接口。
public interface ICachingProvider {
// Writes a caching entry
void WriteCachingEntry<T>(string uri, string md5, T data);
// Reads a caching entry sync
Tuple<string, T> ReadCachingEntry<T>(string uri);
// Reads a caching entry async
Task<Tuple<string, T>> ReadCachingEntryAsync<T>(string uri);
// Clears the cache
void ClearCache();
// The current storage size
long Size { get; }
// How much can be stored maximum
long MaxSize { get; }
}目前,我已经构建了一个MemoryCahingProvider和一个FileSystemCachingProvider,其中最后一个只是在隔离存储中存储JSON文件。
现在我的计划是,也实现一个数据库缓存系统,我希望更好的速度和更少的空间使用,也许我错了。
为了解决这个问题,我不确定应该使用哪种类型的数据库。首先,我想到的只是一个SQLlite数据库,但这并不是真正有效的,因为我有多个类型的元素,类似于Facebook。下一个目标是CouchDB或MongoDB,但我不想在客户端系统上安装比需要的更多的软件。
有人有这种缓存的经验吗?或者有人知道如何构建类似的缓存,以及使用哪种数据库类型?
发布于 2015-02-12 22:58:40
您可能想看看MSDN上的System.Web.Caching文档。关于缓存数据,有一些很好的抽象想法,它们与任何系统都相关,包括在网站之外。
例如,CacheDependency类:
在存储在ASP.NET应用程序的缓存对象中的项与文件、缓存键、任意一个或另一个CacheDependency对象的数组之间建立依赖关系。CacheDependency类监视依赖关系,以便当其中任何关系发生变化时,缓存的项将被自动删除。
虽然您的缓存听起来与ASP.NET的缓存没有任何关系,但是在创建自己的缓存时遵循这个示例应该是有益的。
至于您的ICachingProvider,OutputCacheProvider声明:
当您从OutputCacheProvider继承时,必须重写以下成员:. Add·Get·Remove·Set
我发现这是一个很好的实践,可以看到微软创建了什么以及他们为类似对象使用的命名约定,然后在我自己的类中重用这些想法。这是有益的,因为其他可能使用您的类并有使用Microsoft类似类的经验的程序员应该更容易实现您的解决方案。
下一个目标是CouchDB或MongoDB,但我不想在客户端系统上安装比需要的更多的软件。
如果您正在构建数据库缓存,那么它不应该关心后端是什么(除非是存储缓存的地方,但随后我问它如何比一般的数据库更快)。
https://softwareengineering.stackexchange.com/questions/273072
复制相似问题