【问题标题】:Database Table Data Types To Store Key/Value Cache用于存储键/值缓存的数据库表数据类型
【发布时间】: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


【解决方案1】:

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

聚集 IDENTITY 索引在消除聚集索引上的页面拆分方面效果更好 - 您可以在键名上使用唯一索引,该索引使用 INCLUDE 子句来包含您的值。但是-在您的情况下,我看不到这样做的好处,因为您的唯一索引上会遇到完全相同的页面拆分问题,并且键名上的聚集索引的阅读成本不会更高,因为您不会t 有任何额外的列。另外,您将在两个索引上进行索引更新成本以进行写入。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2011-03-22
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多