2011-03-06 75 views
5

我想刪除我在Web應用程序上加載(幾乎)每個請求的小塊數據的sql依賴性。大多數數據是鍵值/文檔結構化的,但不排除關係型解決方案。數據不是太大,所以我想保存在內存中以獲得更高的可用性。對內存數據庫的建議

你會推薦什麼解決方案?

+0

你可以分享你正在使用的web堆棧嗎? LAMP或.NET還是? – DuckMaestro 2011-03-06 09:48:50

回答

6

最簡單和使用最廣泛的內存中鍵值存儲是MemcacheD。介紹頁面重新迭代你所要求的:

Memcached是從數據庫調用,API調用或網頁的結果任意小的數據塊(字符串,對象)在內存中的key-value存儲渲染。

客戶名單令人印象深刻。這已經很長時間了。良好的文檔。它具有幾乎所有編程語言的API。水平縮放非常簡單。就我的經驗而言,Memcached很好。您可能還想查看MemBase

1

我不確定這是你在找什麼,但你應該看看緩存框架(可能包含在你現在使用的工具中的東西)。通過存儲庫模式,您可以查詢數據,然後檢查是否通過密鑰將其存儲在緩存中。我不知道,你從數據庫中獲取它,如果你這樣做,你從緩存中獲取它。

這取決於您處理的數據類型,因此您需要決定將數據保存在緩存中需要多長時間。也許滑動超時是最好的,因爲只要密鑰不斷被請求,就會保留數據。這意味着如果緩存具有用戶的數據,則一旦用戶消失,數據將從緩存中過期。

6

Redis非常適合這種數據。它還支持一些基本的數據結構並提供對它們的操作。

我最近將我的Django論壇應用程序轉換成了用於所有實時/跟蹤數據的應用程序 - 它非常好,不會再遇到你做這種東西時的噁心感覺(SET views = views + 1以及其他每個頁面上的寫入查看)與關係數據庫。

下面是使用Redis的存儲用戶活動跟蹤所需的數據,包括保持一組有序的最後一次看到用戶最新的,在Python的例子:

def seen_user(user, doing, item=None): 
    """ 
    Stores what a User was doing when they were last seen and updates 
    their last seen time in the active users sorted set. 
    """ 
    last_seen = int(time.mktime(datetime.datetime.now().timetuple())) 
    redis.zadd(ACTIVE_USERS, user.pk, last_seen) 
    redis.setnx(USER_USERNAME % user.pk, user.username) 
    redis.set(USER_LAST_SEEN % user.pk, last_seen) 
    if item: 
     doing = '%s <a href="%s">%s</a>' % (
      doing, item.get_absolute_url(), escape(str(item))) 
    redis.set(USER_DOING % user.pk, doing) 
3

如果你不介意的sql但想要將db保存在內存中,則可能需要檢出sqlite(請參閱http://www.sqlite.org/inmemorydb.html)。

如果你不想要sql,而且你真的只有鍵值對,爲什麼不把它們存儲在一個map/hash/associative數組中,並完成它呢?

2

如果最終需要內存數據庫,H2是一個非常好的選擇。

2

還有一個數據庫需要考慮:Berkeley DB。 Berkeley DB允許您將數據庫配置爲內存,磁盤或兩者。它支持鍵值(NoSQL)和SQL API。 Berkeley DB通常與Web應用程序結合使用,因爲它是嵌入式的,易於部署(可隨應用程序部署),高度可配置且非常可靠。有幾個電子零售網站依靠Berkeley DB爲其電子商務應用程序(包括Amazon.com)提供服務。

+2

你應該在這個答案中披露你與BDB的關係。 – user7116 2013-01-21 16:57:17

+1

BerkeleyDB的另一個問題是它的AGPL許可證,這意味着如果你想在你的應用程序中使用它,你必須購買專有許可證或開源應用程序。 – user1876508 2014-06-12 22:57:08

0

你能分解這些數據嗎?數據訪問模式是否簡單且穩定(不隨業務需求的變化而變化)?這個數據有多關鍵(例如,會話上下文不太難恢復,而用戶在設置頁面上輸入的某些偏好不應該丟失)?

通常情況下,只要您可以分片並且您的數據訪問模式很簡單並且不會突變太多,那麼您可以選擇Redis。如果您尋找更可靠的產品並支持更先進的數據訪問模式,Tarantool是一個不錯的選擇。