在高併發的分布式系統中,加入快取機制可以很大的提高效能。最近做的xx省的電信bss專案中就用到了memcached,系統中將查詢到的結果快取到memcached 中
(下面稱mc好了)
。對於配置類的規格資料,是不經常改變的。在mc中的命中率高達90%以上。
試想如果取消快取機制,每秒幾萬、幾十萬的資料訪問都會請求資料庫。會造成資料庫連線不夠用的情況,系統效能會大大降低。伺服器的壓力會瞬間上公升。
具體場景是:系統正在執行時,由於某種原因,需要修改某項配置資料,並且要求立即生效。
mc給我們帶來了方便,但是對於乙個龐大的mc集群,可能多達幾十個memcached節點,總容量達上百gb。如果快速更新快取中的舊資料呢。
mc本身提供了遍歷下面的item的功能,但在這裡顯然不適用,因為我們的資料太多了。
原來系統的做法是:將每乙個key儲存起來,當系統發出更新指令的時候,將儲存起來的key對應的item從mc中逐個刪除。
顯然這不是乙個好方法。因為mc儲存的物件不能太大(最大是1mb),如果儲存key的集合太大、就會存不進mc,連之前儲存的也一起丟失了。最後只能將整個mc集群flushall掉。
flushall可能不是我們希望的,比如我們同事在mc集群中儲存了a地區的配置資料、b地區的、c地區的資料。而我們現在只想更新a地區的資料,這個時候就不能使用flushall了。
我的做法是通過一套非同步的 發布-訂閱 方式,利用公共容器mc或者資料庫來實現mc資料更新。
圖示如下:
通過webservice將更新指令送入mc,分布式的各個應用程式中的守護執行緒會定期掃瞄mc,獲取最新的指令,和上乙個版本比對,如果發現不一樣就將當前的快取版本號更新成最新的——mcversion=。
應用程式中從快取查取資料,會先生成乙個key。
key = 引數資訊 + 地區資訊 +mcversion;
此時,mcversion已經被更新了,所以生成的key也就和之前的不一樣了。
這樣就能達到更新快取的目的了。
這種方法最大的優點是高效,而且可以將各地區的資料在邏輯上分離。因為key中加入了地區資訊。
如: 北京地區的某個配置資訊可能是 key = offerspec_123_010_version0.1
上海地區的對應的配置資訊就是 key = offerspec_123_021_version0.1
如果此時應用中快取版本發生變化,從version0.1 變成 version0.2
那麼北京和上海地區的 原來對應的key就會變成:
offerspec_123_010_version0.2
offerspec_123_025_version0.2
你不必擔心原來的舊資料會留在mc中,揮之不去。其實不然,你只需要在存資料到快取的時候,加上乙個失效時間久可以了。mc會到期將一些無用的或者過期的資料清除掉。
如何快速高效的群發Email
如何快速高效的 email 宣傳中,email營銷是成本最低,而回報率又相對比較高的方法.特別對電子商務型別的 是最行之有效的方法.我們不僅常向自己的會員傳送email,手裡也會有一批資料巨大的email資料.那麼如何批量的快速的向這些人傳送我們的email呢.經過我們寫程式,批量一封封的發,速度大...
快速了解《如何高效學習》
學習策略有很多 諸如閱讀方法 提問方法等等 應該多去尋找學習方法,把優秀的學習方法整合到自己的學習策略中,通過不斷的整合和實踐,最終找到適合自己的學習理論和策略。獲取 理解 擴充套件 糾錯 應用 第一步 選擇要學習的概念 首先選好你打算深入理解的概念,拿一張空白紙,在最上方寫下概念的名稱。第二步 設...
如何快速 高效地閱讀文獻資料
1。由點到面。選工作實踐中的疑點,熱點,由乙個小枝節,檢索較全的文獻,一般近期的20 篇左右已經相當多了。之所以不必在意3年以前的,是因為知識更新非常快,且網上能查到的多為近幾年的全文。學習別人是怎麼發現解決問題的。知道目前對這個問題的共同看法,和分歧。然後,擴充套件開,根據興趣和研究的目的,知道,...