2012-01-23 31 views
1

我有一個應用程序,我想將某些信息彙總到membase中,以避免查詢中出現昂貴的組。例如,點擊轉換將被記錄在MySQL中,並且我希望在某個memcache密鑰中爲特定用戶保留按小時分組的點擊總數。 在那裏我可以用我需要的值來取消/序列化一個數組。我有很多其他的需求,如收入,喜歡等等。同步mysql和memcached/membase

什麼是最好的方式來創建某種「事務」,以確保MC和Mysql保持同步?我總是可以重建基於底層MySQL存儲的密鑰存儲,但是我希望在這兩種產品之間保持良好的併發性。

回答

0

在較高水平,使用Membase的/內存緩存/等作爲mysql的緩存,你會想要做類似如下:

public Object readMethod(String key) { 
    value = membaseDriver->get(key); 
    if(value != null) { 
     return value; 
    } 
    value = getFromMysql(key); 
    membaseDriver->put(key, value, TTL); 
} 

public Object writeMethod(String key, String value) { 
    writeToMysql(key, value); 
    membaseDriver->delete(key); 
    //next call to get will get the value that we just wrote to db 
} 

這可以確保您的數據庫仍是主要來源數據並確保membase和mysql保持同步。 (它是而不是在進程正在執行write方法的同時,在它已經寫入到mysql之後並且它已經從membase刪除密鑰之前)。

如果您希望它們真正同步,您必須確保在任何進程正在執行writeMethod時,任何進程都不能執行readMethod。您可以使用add方法在memcache/membase中執行簡單的全局鎖定。基本上,如果添加成功,您添加一個以您的鎖名稱命名的唯一鍵(例如:「MY_LOCK」),您將獲得鎖,在此情況發生後,沒有其他人可以獲取鎖。當你完成你的寫作時,你可以通過調用你的鎖的鍵名稱來刪除鎖。通過用「鎖定」啓動這兩種方法,並使用「解鎖」結束這兩種方法,確保一次只有一個進程正在執行任一進程。除此之外,你也可以建立獨立的讀寫鎖,但是我認爲鎖並不是真正想要的,除非你需要100%保持最新(而不是99.999%的最新版本)。

在每小時點擊次數情況下,您可以避免每次通過保持當前小時(即:將更改的唯一一個小時)與所有以前的小時數組分開的次數來計算另一次點擊時重新運行查詢(這可能永遠不會改變,對吧?)。

每次添加點擊時,只需在當前小時計數器上使用memcache增量。然後,當您收到讀取請求時,請查看之前所有小時的數組,然後查看當前小時,以及以當前小時數結尾的所有前幾小時。作爲一項免費獎勵,增量爲原子的事實爲您提供了實際同步的值,因此您可以跳過鎖定。