2013-02-15 156 views
1

我正在開發一個需要鍵/值緩存功能的項目,但應用程序將存在於一個非常有限的環境中,該環境不支持任何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

回答

1

我認爲您的方案keyname列上的羣集主鍵可以正常工作。但是,值得嘗試使用填充因子,因爲您需要的填充因子足夠低以至於不會導致過多的頁面拆分,但是其高度足以保持頁面讀取數量較低。

集羣IDENTITY索引在消除聚簇索引中的頁面拆分方面效果更好 - 並且您可以在使用INCLUDE子句包含值的keyname上使用唯一索引。然而 - 在你的情況下,我沒有看到這樣做的好處,因爲你的獨特索引上的分頁問題完全相同,並且keyname上的聚集索引不會更昂貴,因爲你不會閱讀它,沒有任何額外的列。另外,你會有兩個索引的索引更新成本寫入。

希望有所幫助。

+0

謝謝你的幫助! – 2013-02-15 16:06:33