1. 程式人生 > >如何使用redis做mysql的快取

如何使用redis做mysql的快取

應用Redis實現資料的讀寫,同時利用佇列處理器定時將資料寫入mysql。

同時要注意避免衝突,在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫資料時,對redis主鍵自增並進行讀取,若mysql更新失敗,則需要及時清除快取及同步redis主鍵。

這樣處理,主要是實時讀寫redis,而mysql資料則通過佇列非同步處理,緩解mysql壓力,不過這種方法應用場景主要基於高併發,而且redis的高可用叢集架構相對更復雜,一般不是很推薦。

《記憶體資料庫和mysql的同步機制》

redis如何做到和mysql資料庫的同步

【方案一】http://www.zhihu.com/question/23401553?sort=created

程式實現mysql更新、新增、刪除就刪除redis資料。

程式查詢redis,不存在就查詢mysql並儲存redis

redis和mysql資料的同步,程式碼級別大致可以這樣做:

讀: 讀redis->沒有,讀mysql->把mysql資料寫回redis

寫: 寫mysql->成功,寫redis(捕捉所有mysql的修改,寫入和刪除事件,對redis進行操作)

【方案二】http://www.linuxidc.com/Linux/2015-01/380.htm

實時獲取mysql binlog進行解析,然後修改redis

MySQL到Redis資料方案

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

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

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

【方案三】

使用mysql的udf,詳情請看MySQL :: MySQL 5.1 Reference Manual :: 22.3 Adding New Functions to MySQL 然後通過trigger在表update和insert之後進行函式的呼叫,寫入到redis中去。大致是這個樣子。

【http://www.zhihu.com/question/27738066】

1.首先明確是不是一定要上快取,當前架構的瓶頸在哪裡,若瓶頸真是資料庫操作上,再繼續往下看。

2.明確memcached和redis的區別,到底要使用哪個。前者終究是個快取,不可能永久儲存資料(LRU機制),支援分散式,後者除了快取的同時也支援把資料持久化到磁碟等,redis要自己去實現分散式快取(貌似最新版本的已整合),自己去實現一致性hash。因為不知道你們的應用場景,不好說一定要用memcache還是redis,說不定用mongodb會更好,比如在儲存日誌方面。

3.快取量大但又不常變化的資料,比如評論。

4.你的思路是對的,清晰明瞭,讀DB前,先讀快取,如果有直接返回,如果沒有再讀DB,然後寫入快取層並返回。

5.考慮是否需要主從,讀寫分離,考慮是否分散式部署,考慮是否後續水平伸縮。

6.想要一勞永逸,後續維護和擴充套件方便,那就將現有的程式碼架構優化,按你說的替換資料庫元件需要改動大量程式碼,說明當前架構存在問題。可以利用現有的一些框架,比如SpringMVC,將你的應用層和業務層和資料庫層解耦。再上快取之前把這些做好。

7.把讀取快取等操作做成服務元件,對業務層提供服務,業務層對應用層提供服務。

8.保留原始資料庫元件,優化成服務元件,方便後續業務層靈活呼叫快取或者是資料庫。

9.不建議一次性全量上快取,最開始不動核心業務,可以將邊緣業務先換成快取元件,一步步換至核心業務。

10.重新整理記憶體,以memcached為例,新增,修改和刪除操作,一般採用lazy load的策略,即新增時只寫入資料庫,並不會馬上更新Memcached,而是等到再次讀取時才會載入到Memcached中,修改和刪除操作也是更新資料庫,然後將Memcached中的資料標記為失效,等待下次讀取時再載入。