本篇文章為大家展示了redis中怎么緩存MySQL,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
目前成都創(chuàng)新互聯(lián)公司已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、鄉(xiāng)寧網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
應(yīng)用Redis實現(xiàn)數(shù)據(jù)的讀寫,同時利用隊列處理器定時將數(shù)據(jù)寫入mysql。
同時要注意避免沖突,在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫數(shù)據(jù)時,對redis主鍵自增并進(jìn)行讀取,若mysql更新失敗,則需要及時清除緩存及同步redis主鍵。
這樣處理,主要是實時讀寫redis,而mysql數(shù)據(jù)則通過隊列異步處理,緩解mysql壓力,不過這種方法應(yīng)用場景主要基于高并發(fā),而且redis的高可用集群架構(gòu)相對更復(fù)雜,一般不是很推薦。
redis如何做到和mysql數(shù)據(jù)庫的同步
【方案一】
http://www.zhihu.com/question/23401553?sort=created
程序?qū)崿F(xiàn)mysql更新、添加、刪除就刪除redis數(shù)據(jù)。
程序查詢redis,不存在就查詢mysql并保存redi
redis和mysql數(shù)據(jù)的同步,代碼級別大致可以這樣做:
讀: 讀redis->沒有,讀mysql->把mysql數(shù)據(jù)寫回redi
寫: 寫mysql->成功,寫redis(捕捉所有mysql的修改,寫入和刪除事件,對redis進(jìn)行操作)
【方案二】
http://www.linuxidc.com/Linux/2015-01/380.htm
實時獲取mysql binlog進(jìn)行解析,然后修改redi
MySQL到Redis數(shù)據(jù)方案
無論MySQL還是Redis,自身都帶有數(shù)據(jù)同步的機(jī)制,像比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現(xiàn)的,這樣的數(shù)據(jù)其實還是一個異步過程,只不過當(dāng)服務(wù)器都在同一內(nèi)網(wǎng)時,異步的延遲幾乎可以忽略。
那么理論上我們也可以用同樣方式,分析MySQL的binlog文件并將數(shù)據(jù)插入Redis。但是這需要對binlog文件以及MySQL有非常深入的理解,同時由于binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現(xiàn)同步的工作量是非常大的。
因此這里選擇了一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的MySQL UDF,將MySQL數(shù)據(jù)首先放入Gearman中,然后通過一個自己編寫的PHP Gearman Worker,將數(shù)據(jù)同步到Redis。比分析binlog的方式增加了不少流程,但是實現(xiàn)成本更低,更容易操作。
【方案三】
使用mysql的udf,詳情請看MySQL :: MySQL 5.1 Reference Manual :: 22.3 Adding New Functions to MySQL 然后通過trigger在表update和insert之后進(jìn)行函數(shù)的調(diào)用,寫入到redis中去。大致是這個樣子。
【http://www.zhihu.com/question/27738066】
1.首先明確是不是一定要上緩存,當(dāng)前架構(gòu)的瓶頸在哪里,若瓶頸真是數(shù)據(jù)庫操作上,再繼續(xù)往下看。
2.明確memcached和redis的區(qū)別,到底要使用哪個。前者終究是個緩存,不可能***保存數(shù)據(jù)(LRU機(jī)制),支持分布式,后者除了緩存的同時也支持把數(shù)據(jù)持久化到磁盤等,redis要自己去實現(xiàn)分布式緩存(貌似***版本的已集成),自己去實現(xiàn)一致性hash。因為不知道你們的應(yīng)用場景,不好說一定要用memcache還是redis,說不定用MongoDB會更好,比如在存儲日志方面。
3.緩存量大但又不常變化的數(shù)據(jù),比如評論。
4.你的思路是對的,清晰明了,讀DB前,先讀緩存,如果有直接返回,如果沒有再讀DB,然后寫入緩存層并返回。
5.考慮是否需要主從,讀寫分離,考慮是否分布式部署,考慮是否后續(xù)水平伸縮。
6.想要一勞永逸,后續(xù)維護(hù)和擴(kuò)展方便,那就將現(xiàn)有的代碼架構(gòu)優(yōu)化,按你說的替換數(shù)據(jù)庫組件需要改動大量代碼,說明當(dāng)前架構(gòu)存在問題。可以利用現(xiàn)有的一些框架,比如SpringMVC,將你的應(yīng)用層和業(yè)務(wù)層和數(shù)據(jù)庫層解耦。再上緩存之前把這些做好。
7.把讀取緩存等操作做成服務(wù)組件,對業(yè)務(wù)層提供服務(wù),業(yè)務(wù)層對應(yīng)用層提供服務(wù)。
8.保留原始數(shù)據(jù)庫組件,優(yōu)化成服務(wù)組件,方便后續(xù)業(yè)務(wù)層靈活調(diào)用緩存或者是數(shù)據(jù)庫。
9.不建議一次性全量上緩存,最開始不動核心業(yè)務(wù),可以將邊緣業(yè)務(wù)先換成緩存組件,一步步換至核心業(yè)務(wù)。
10.刷新內(nèi)存,以memcached為例,新增,修改和刪除操作,一般采用lazy load的策略,即新增時只寫入數(shù)據(jù)庫,并不會馬上更新Memcached,而是等到再次讀取時才會加載到Memcached中,修改和刪除操作也是更新數(shù)據(jù)庫,然后將Memcached中的數(shù)據(jù)標(biāo)記為失效,等待下次讀取時再加載。
上述內(nèi)容就是Redis中怎么緩存MySQL,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站題目:Redis中怎么緩存MySQL
轉(zhuǎn)載來源:http://www.chinadenli.net/article4/ieooie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、外貿(mào)建站、靜態(tài)網(wǎng)站、Google、定制開發(fā)、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)