database - example - sqlite memory




對內存數據庫的建議 (6)

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

你會推薦什麼解決方案?


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)

如果你不介意這個sql,但是想把db保存在內存中,你可能需要檢查sqlite(參見http://www.sqlite.org/inmemorydb.html )。

如果你不想要的SQL,你只有鍵值對,為什麼不把它們存儲在一個地圖/散列/關聯數組,並完成它呢?


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

這將取決於您處理的數據類型,因此您需要決定將數據保存在緩存中的時間。 也許一個滑動超時是最好的,因為只要密鑰持續被請求,你就會保持數據。 也就是說,如果緩存具有用戶的數據,則一旦用戶離開,數據將從緩存中過期。


最簡單和使用最廣泛的內存鍵值存儲是MemcacheD 。 介紹頁面重複您要求的內容:

Memcached是內存中的鍵值存儲,用於從數據庫調用,API調用或頁面呈現的結果中為任意數據(字符串,對象)提供小塊數據。

客戶名單令人印象深刻。 這已經很長時間了。 良好的文檔。 它幾乎包含所有編程語言的API。 水平縮放非常簡單。 由於我的經驗去Memcached是好的。

你可能也想看看MemBase


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

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


請檢查這個:

http://www.mongodb.org/

它是一個非常好的非SQL數據庫,驅動程序和所有主要語言的支持。





in-memory-database