2012-11-29 53 views
1

我看到你可以原子地增加IronCache中的值,但是如果你有很多IronWorkers試圖將put值寫入單個緩存鍵?爲了將更新同步到緩存或者是否存在其他慣用方式,將這些值更新放在Message Queue上會更好嗎?IronCache的原子更新

+0

嗨@devth,你試圖把什麼它放入緩存?你需要有正確的工作人員的順序嗎? –

+0

Hi @ Travis,我將狀態彙總存儲在一個緩存鍵中。不同的工作人員可以更新狀態的不同部分(值是層次結構json)。只要它們不能同時讀取/更新,就沒有問題,但爲了避免競爭條件而無需手動同步,我需要進行比較和交換。 – devth

回答

1

目前沒有慣用的方式來更新非整數緩存項目,而不會激發競爭條件神。解決這個限制有很多不同的方法,但是你的MQ解決方案(假設只有一個工作人員正在寫更改)可能是你最好的選擇。

我們意識到這個缺點,並且我們正在努力解決問題,但目前我們沒有任何聲明。

+0

謝謝@ Paddy - 有道理。 – devth

+0

如何確保單身職工?我正在尋找使用webhooks來激發工作人員從隊列中消費更新,但這可能會觸發同一工作人員的多個實例。 – devth

+0

@devth您可以在上傳代碼時使用max_concurrency屬性來限制可以並行運行的工作人員數量。要創建一個單身人員,只需將它設置爲1. :) – Paddy

1

做到這一點的一種方法是將您的值分成多個緩存條目。假設你有你的JSON層次:

{ 
    "x": "y", 
    "sub1": { 
     "a": "b" 
    }, 
    "sub2": { 
     "c": "d" 
    } 
} 

將其更改爲:

{ 
    "x": "y", 
    "sub1": "cache_key_a", 
    "sub2": "cache_key_b" 
} 

然後在cache_key_a:

{ 
    "a": "b" 
} 

,做同樣的cache_key_b等。這能解決你的問題嗎?

+0

我把它作爲一個單一鍵的原因是因爲我的前端在每一頁上都請求緩存。它是由後臺工作人員定期更新的狀態緩存,並且FE需要始終顯示最新狀態。如果我將它分成單獨的k/v對,它會在每個頁面加載時變成大約15個緩存請求。 – devth