【发布时间】:2013-01-31 10:48:31
【问题描述】:
我正在开发一个需要键/值缓存功能的项目,但该应用程序将存在于一个非常有限的环境中,不支持任何行业标准的内存缓存方法,例如ASP.NET 缓存、memcached、AppFabric。
在这种限制性环境中,我们唯一的选择是 MS SQL 数据库。我们必须创建一个简单的键/值表来满足我们的键/值缓存需求。我们很可能会将数据序列化为 JSON,但我不确定密钥的最佳数据类型是什么。它显然需要是一个唯一的键,并且需要由获取和设置缓存的程序员读取。它还需要快速查找,因为我们已经失去了性能而无法访问“内存中”缓存解决方案。
我习惯于让我的主键列是 int 或 bigint 值。在这种情况下,主键(缓存键)应该是 char 或 varchar 数据类型,因为所有查询都是:
SELECT value FROM CacheTable WHERE key = 'keyname'
我还看到有关使用 md5 哈希的帖子,但其他帖子指出不能始终依靠哈希来生成唯一键。我基本上是在对数据类型提出一些建议之后,而不是“键”列是否应该是主键,或者我是否仍应该创建一个 int 或 bigint 主键(即使它可能不会被使用)。
我们追求的最终结果是创建一个类似于 .NET 的本机缓存的缓存类,我们可以在其中创建一个从数据库表中提取的静态类,例如:
CustomDatabaseCache.Set(string key, object value);
CustomDatabaseCache.Get(string key)
【问题讨论】:
-
您认为
cache database需要多少行?此外,您是否需要将缓存值按会话分隔? -
所有缓存值都是唯一的,因此如果为用户的会话缓存了一个值,它将有一个类似于“UserId_SessionKey”的缓存键。
-
该应用程序将支持多个具有用户特定内容的子站点,因此缓存表的大小可以在 100K 到 500K 条目的区域内变得相当大。我们可能会编写某种类型的自动化例程来根据创建的时间戳清除过期的缓存。
标签: asp.net sql-server caching