全資料增量同步
所謂全資料校驗,即所有的快取資料首先都同步至redis,然後根據資料的時間戳來進行同步。分解步驟如下:
首先將快取的資料初始化,同步至redis和memorycache,保持初始資料的同步
第二步,每當操作了資料之後,給記錄乙個時間戳標識最近的更新。
memorycache定時或者每次取資料的時候,以最近的乙個同步的時間戳開始同步到現在的時間戳
上面的方案咱們落地到.net+redis又該怎麼處理呢?
第一步很簡單直接跳過,第二步就有點問題了,這個時間戳要便於redis的排序和獲取,考慮到這些問題,我覺得取linux的數字型時間戳比較靠譜,再配合sortset來建立索引,進行同步,看起來的確不錯。那麼來看下**:
本篇還是以user為例,可能場景不適合,大家將就理解
public同步:void
updatetoredis(user user)
public上面的**只是例項,實際執行的時候感覺還不是特別靠譜。void sync(double
timespan)
});"]
");var users = jsonconvert.deserializeobject>(portsjson.tostring());
//和記憶體的list做同步
...
//end
}
訊息通知
我覺得.net因為有了優秀的event機制,才讓我覺得它使用起來很方便
但是這裡是伺服器之間的通訊,我想非scoket莫屬了,之間做過scoket雙向通訊,印象特別深刻,這樣的場景讓我自然而然的想到了這個方案。可是特別的增加乙個socket,本身複雜的架構要更複雜了,還是尋求乙個靠譜的中介軟體比較適合。看過redis的功能列表的同學,一定沒忘記redis還有乙個訂閱發布,pub/sub功能。於是我就利用了這個功能,設計了如下的方案:
在每乙個快取物件更新的同時,增加非同步pub訊息到redis
先來看下redis的,pub/sub功能,請看文件
redis提供指定channel的訂閱發布功能,每乙個client可以訂閱指定的channel訊息,也可以向指定的channel傳送訊息。
利用servicestack.redis的pub/sub功能實現如下:
using (var redisconsumer = new傳送:redisclient(testconfig.singlehost))
using (var subscription =redisconsumer.createsubscription())
; subscription.onunsubscribe = channel =>;
subscription.onmessage = (channel, msg) =>;
subscription.subscribetochannels(
"capqueen:redis:events
"); //
blocking
}
using (var redispublisher = new這裡我覺得message應該定義成乙個訊息體,接收處理應該根據具體的訊息定義來具體處理,因為訂閱發布的通道顯然應該是合理利用,如果乙個業務乙個通道,有點太多了。redisclient("localhost"))
當然這個實現起來又要講一大篇了,這裡不多說明。
到底該如何學習演算法?
很多人學習演算法都特別重視 不管是偽 也好還是具體語言 也好,然而我認為 不是那麼重要的,即使書上只有 你也不能只拘泥於 層面,而是應該通過逆向去弄明白這個演算法到底是怎麼回事,而不能停留在程式執行過程這個表面上。實際上,如果我告訴你乙個演算法的大體思想,你自己寫出實現 應該是不成問題,而記住思想總...
雲原生到底該如何理解
什麼是雲原生?我們已經進入智雲時代,雲原生這個詞在行業裡異常火爆。那麼到底什麼是雲原生呢?我們知道雲的目的是為了簡化交付 規模和管理,以推動創新。公有雲不僅改變了企業開展業務的方式,還改變了安全廠商營銷產品的方式,所以我們看到很多廠商都聲稱其要提供 雲原生 解決方案。但是,雲原生應該不僅僅是一種營銷...
Redis系列(八) 快取到底該如何做到高可用?
什麼情況會導致快取不可用?單點問題 什麼是單點問題呢?就是我們在使用快取時,有時候由於 qps 記憶體容量只需要乙個埠 此處的乙個埠是指一主一從 就可以扛住所有讀寫請求時,比如寫 qps 5k,讀 qps 30k,記憶體 5g 根據這個資料規模,dba 在部署資源時會選擇只部署乙個節點。當快取資源由...