回覆列表
  • 1 # 使用者1465424935672

    對於變化頻率非常快的資料來說,如果還選擇傳統的靜態快取方式(memocached、filesystem等)展示資料,可能在快取的存取上會有很大的開銷,並不能很好的滿足需要,而redis這樣基於記憶體的nosql資料庫,就非常適合擔任實時資料的容器。

    但是往往又有資料可靠性的需求,採用mysql作為資料儲存,不會因為記憶體問題而引起資料丟失,同時也可以利用關係資料庫的特性實現很多功能。

    所以就會很自然的想到是否可以採用mysql作為資料儲存引擎,redis則作為cache。而這種需求目前還沒有看到有特別成熟的解決方案或工具,因此採用gearman+php+mysqludf的組合非同步實現mysql到redis的資料複製。

    mysql到redis資料複製方案

    無論mysql還是redis,自身都帶有資料同步的機制,比較常用的mysql的master/slave模式,就是由slave端分析master的binlog來實現的,這樣的資料複製其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步的延遲幾乎可以忽略。

    那麼理論上也可以用同樣方式,分析mysql的binlog檔案並將資料插入redis。但是這需要對binlog檔案以及mysql有非常深入的理解,同時由於binlog存在statement/row/mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。

    因此這裡選擇了一種開發成本更加低廉的方式,借用已經比較成熟的mysqludf,將mysql資料首先放入gearman中,然後透過一個自己編寫的phpgearmanworker,將資料同步到redis。比分析binlog的方式增加了不少流程,但是實現成本更低,更容易操作。

  • 中秋節和大豐收的關聯?
  • 兩個人蓋一個被子真的能睡好嗎?