2015-04-30 34 views
1

我們有計劃在應用程序端緩存數據庫表(以避免數據庫調用)。我們的緩存是關鍵值&值對的實現。如果我使用主鍵(column1)作爲鍵並將所有其他數據作爲值,那麼我們如何執行以下針對緩存的查詢?多個鍵和值對搜索

select * from table where column1 =?
select * from表where column2 =?和column3 =?
select * from table where column4 =?和 column5 =?和column6 =?

一個最簡單的選擇是構建3個緩存,如下所示。

(列1) - >數據
(列2 +欄3) - >數據
(column4 + column5) - > 數據

任何其他更好的選擇?

要點:

  • 表中包含數百萬條記錄
  • 我們使用的是Java的ConcurrentHashMap的緩存實現。
+1

您是否考慮過像H2這樣的內存數據庫,而不是重新構建查詢系統? – CPerkins

+0

您是否考慮在'Hibernate'中使用標準緩存? https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html它將解決您的問題並避免緩存實施問題。 –

回答

1

看起來像你想的內存緩存。番石榴有很酷的緩存 - 你需要一個LoadingCache。

這裏是鏈接到LoadingCache

基本上,你的問題,想法是有三個LoadingCache。 LoadingCache有一個你應該實現的方法。該方法告訴在給定輸入的情況下加載緩存,在緩存未命中的情況下如何獲取數據。所以,第一次訪問query1的加載緩存時,會有一個緩存未命中。加載緩存將使用您實現的方法(您的傳統DAO方法)來獲取數據,將其放入緩存並將其返回給您。下次您訪問它時,它將從內存中的guava緩存中提供。

所以,如果你有三個方法

Data getData(Column1 column) 
Data getData(Column2 column2, Column3 column3) 
Data getData(Column4 column4, Column5 column5, Column6 column6) 

你的三個LoadingCache將調用來自你寫的負載實現這些方法。就是這樣。我覺得它很乾淨,很容易得到你想要的。

1

您提到您必須緩存數百萬條記錄。這是一個相當大的數字。我不建議你構建自己的緩存框架,特別是不要基於簡單的數據結構,如HashMaps。 我強烈建議Redis - 檢查http://redis.io。諸如Twitter,Stackoverflow等公司正在使用Redis作爲其緩存。

這裏是Redis的的現場演示 - http://try.redis.io