Redis到底該如何利用(三)?

2022-01-16 09:01:44 字數 1742 閱讀 6057

全資料增量同步

所謂全資料校驗,即所有的快取資料首先都同步至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

redisclient("localhost"))

這裡我覺得message應該定義成乙個訊息體,接收處理應該根據具體的訊息定義來具體處理,因為訂閱發布的通道顯然應該是合理利用,如果乙個業務乙個通道,有點太多了。

當然這個實現起來又要講一大篇了,這裡不多說明。

到底該如何學習演算法?

很多人學習演算法都特別重視 不管是偽 也好還是具體語言 也好,然而我認為 不是那麼重要的,即使書上只有 你也不能只拘泥於 層面,而是應該通過逆向去弄明白這個演算法到底是怎麼回事,而不能停留在程式執行過程這個表面上。實際上,如果我告訴你乙個演算法的大體思想,你自己寫出實現 應該是不成問題,而記住思想總...

雲原生到底該如何理解

什麼是雲原生?我們已經進入智雲時代,雲原生這個詞在行業裡異常火爆。那麼到底什麼是雲原生呢?我們知道雲的目的是為了簡化交付 規模和管理,以推動創新。公有雲不僅改變了企業開展業務的方式,還改變了安全廠商營銷產品的方式,所以我們看到很多廠商都聲稱其要提供 雲原生 解決方案。但是,雲原生應該不僅僅是一種營銷...

Redis系列(八) 快取到底該如何做到高可用?

什麼情況會導致快取不可用?單點問題 什麼是單點問題呢?就是我們在使用快取時,有時候由於 qps 記憶體容量只需要乙個埠 此處的乙個埠是指一主一從 就可以扛住所有讀寫請求時,比如寫 qps 5k,讀 qps 30k,記憶體 5g 根據這個資料規模,dba 在部署資源時會選擇只部署乙個節點。當快取資源由...