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

问题描述:

我正在开发一个需要键/值缓存功能的项目,但应用程序将存在于一个非常有限的环境中,该环境不支持任何go-to industry标准内存缓存方法,如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) 
+0

你认为这个'cache database'需要有多少行?另外,你是否需要保持缓存值由会话分隔? – Steve 2013-02-15 12:52:26

+0

所有的缓存值都是唯一的,所以如果在用户会话中缓存了一个值,那么它将拥有一个沿着“UserId_SessionKey”行的缓存键。 – 2013-02-15 13:32:07

+0

该应用程序将支持多个子站点,这些子站点都具有用户特定的内容,因此缓存表的大小在100K到500K的条目范围内可能变得相当大。我们可能会根据创建的时间戳写一些类型的自动化例程来清除过期的缓存。 – 2013-02-15 13:33:19

我认为您的方案keyname列上的群集主键可以正常工作。但是,值得尝试使用填充因子,因为您需要的填充因子足够低以至于不会导致过多的页面拆分,但是其高度足以保持页面读取数量较低。

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

希望有所帮助。

+0

谢谢你的帮助! – 2013-02-15 16:06:33