数据库表数据类型存储键/值缓存

时间:2013-02-15 12:48:35

标签: asp.net sql-server caching

我正在开发一个需要键/值缓存功能的项目,但该应用程序将存在于一个非常有限的环境中,不支持任何行业标准内存缓存方法,例如 ASP.NET缓存,memcached,AppFabric

我们在此限制性环境中唯一的选择是MS SQL数据库。我们必须创建一个简单的键/值表来满足我们的键/值缓存需求。我们很可能将数据序列化为JSON,但我不确定密钥的最佳数据类型是什么。它显然需要是一个唯一的密钥,并且需要程序员可以读取和设置缓存。它还需要快速查找,因为我们已经失去了无法访问“内存”缓存解决方案的性能。

我习惯将主键列设为int或bigint值。在这种情况下,主键(缓存键)应该是char或varchar数据类型,因为所有查询都将是:

SELECT value FROM CacheTable WHERE key = 'keyname'

我还看到了有关使用md5哈希的帖子,但其他帖子指出,不能依赖哈希来始终生成唯一键。我基本上是在对数据类型提出一些建议,而不是'key'列应该是主键,或者我是否应该仍然创建一个int或bigint主键(即使它可能不会被使用)。

我们所追求的最终结果是创建一个类似于.NET的本机缓存的缓存类,我们可以创建一个从数据库表中提取的静态类,如:

CustomDatabaseCache.Set(string key, object value);
CustomDatabaseCache.Get(string key)

1 个答案:

答案 0 :(得分:1)

我认为在你的方案中,你的keyname列上有一个聚簇主键可以正常工作。但是,值得尝试使用填充因子,因为您希望填充因子足够低,以至于不会导致过多的页面拆分,但是要足够高,以使页面读取次数保持较低。

群集IDENTITY索引在消除聚簇索引上的页面拆分方面效果更好 - 您可以在keyname上使用唯一索引,该索引使用INCLUDE子句来包含您的值。但是 - 在你的情况下,我没有看到这样做的好处,因为你的唯一索引上有完全相同的页面拆分问题,并且keyname上的聚簇索引读起来不会更贵,因为你不会有任何额外的列。另外,您可以在两个索引上获得索引更新成本。

希望有所帮助。