如何使用Redis做MySQL的緩存

應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入mysql。

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

這樣處理,主要是實時讀寫redis,而mysql數據則通過隊列異步處理,緩解mysql壓力,不過這種方法應用場景主要基于高并發,而且redis的高可用集群架構相對更復雜,一般不是很推薦。

redis如何做到和mysql數據庫的同步

【方案一】

http://www.zhihu.com/question/23401553?sort=created

程序實現mysql更新、添加、刪除就刪除redis數據。

程序查詢redis,不存在就查詢mysql并保存redi

redis和mysql數據的同步,代碼級別大致可以這樣做:

讀: 讀redis->沒有,讀mysql->把mysql數據寫回redi

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

【方案二】

http://www.linuxidc.com/Linux/2015-01/380.htm

實時獲取mysql binlog進行解析,然后修改redi

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中的數據標記為失效,等待下次讀取時再加載。

轉載于:https://www.cnblogs.com/rinack/p/9667457.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL中CREATE DATABASE和CREATE SCHEMA區別(轉)

在使用MS SQL的時候,一般創建數據庫我們都習慣于使用CREATE DATABASE 來完成,而使用CREATE SCHEMA來創建架構,但是在MySQL中,官方的中文文檔在 CREATE DATABASE 語法一節中寫了一句:也可以使用CREATE SCHEMA。那么CREA…

psychopy 與腦電打碼 eeg

2019獨角獸企業重金招聘Python工程師標準>>> 實驗程序就不放了,這里主要放如何向串口發送打碼的代碼 實際上,給腦電打碼的本質就是向串口發送一個字符,腦電的程序會自動在收到該字符的同時在腦電數據上進行標記。以下代碼打開了一…

deepin linux grub,deepin linux 安裝之后 引導錯誤 出現 grub

deepin 安裝之后 引導錯誤,,, 忙了一晚上 終于解決了 太辛苦了 不過明白了grub的工作原理也不虧,,,, 就是 整個過程滿滿的絕望 (哭具體怎么怎么回事 如下安裝deepin 15.11 安裝完之后不能引導 會卡在grub> 界面以上兩種方式 嘗試了6個小時 都是失敗的 期間出現各種問題 一個…

python怎樣連續輸入兩個數字_python實現輸入數字的連續加減

不用庫,寫了很久,一直出bug,到網上一搜,可以直接輸入之后,eval(str)即可得到結果! eval程序如下: sinput("請輸入要運算的數字") print("The result is{}".format(eval(s))…

修改JAVA代碼,需要重啟Tomcat的原因

準確的說只有修改方法中的內容才不需要重啟,因為tomcat中對于方法的調用是動態的,調用方法的時候,方法的內容才會被加載 新增成員變量,方法,或修改靜態方法和靜態變量、創建新的類 這些都是需要重啟的,因為…

python3輸入輸出_Python3 輸入和輸出

輸出格式美化 Python兩種輸出值的方式: 表達式語句和 print() 函數。(第三種方式是使用文件對象的 write() 方法; 標準輸出文件可以用 sys.stdout 引用。) 如果你希望輸出的形式更加多樣,可以使用 str.format() 函數來格式化輸出值。 如果你希望將輸出的值轉成字符串…

用 vue2 和 webpack 快速建構 NW.js 項目(1)

經過實踐和學習,發現本篇文章部分內容已經過時,請看我的關于 Vue 和 NW.js 的 最新文章 和相關實踐項目 vue-nw-seed 。使用到的技能點 vue2webpackNW.jsNode.js一、前言 先講一下這個項目的由來。我司要新上一個產品,是面向教育領域的一個…

mysql -- 索引的使用

普通索引:用于提升查詢速度唯一索引:用于提升查詢速度,還要求字段值不得重復主鍵索引:唯一性且不為空的索引全文索引:用于大量文本搜索中建立的索引雖然索引有好處,但是凡是都有倆面性,提高效率…

surface pro 7 linux,微軟 Surface Pro、Studio、Laptop 全線更新

今晨,微軟在紐約的秋季新品發布會上,發布了 Surface Pro 6、Laptop 2 以及最頂級的 Studio 2 三款備受期待的 Surface 產品。至此,包括年初的 Surface Book 2 在內,完成了2018 年 Surface 產品線所有升級計劃。當然這場規模不算大…

dremwere怎樣讓多個圖片并列排放_PPT圖片布局不好看?六步教你,看完就會。

我們平時很多場合需要演示講解時,少不了使用PPT。尤其目前白領層人士,項目總結、產品介紹、調研報告…無時無刻不被PPT包圍,又無時無刻不被PPT設計所困惱。誠然設計好看實用的PPT需要高質量素材資源和堅實的文字功底。但在處理美化PPT時&…

ThreadLocal 你到底是個什么鬼

2019獨角獸企業重金招聘Python工程師標準>>> 很多文章都拿它跟同步機制作比較,我覺得這個思路對于理解這個東西完全沒有作用。 ThreadLocal跟synchronize這類東西作比較,是很多文章的套路,我感覺這么比較,就跟比較重載…

SqlServer雙機熱備技術實踐筆記

SqlServer雙機熱備,大體上可以通過發布訂閱,日志傳送,數據庫鏡像來實現。 1,發布--訂閱 是最早最簡單的方案,但需要注意發布的時候,發布進程必須對快照目錄有訪問權限,這個問題可以從“查看快照…

安徽大學計算機教學平臺c語言作業,安徽大學計算機教學部練習題與答案1.pdf

一、計算機基礎知識1.下列敘述中,不是電子計算機特點的是_D____。A.運算速度快 B.計算精度高 C.高度自動化 D.邏輯判斷能力差2.現代電子計算機的本質工作原理是__D___。A.能進行算術運算 B.運算速度高 C.計算精度高 D.存儲并自動執行程序3.微型計算機的型號主要是以…

grep 顯示包含兩個關鍵字_linux三劍客之-grep

一、grep簡介1.介紹全局查找正則表達式并且打印結果行的命令。2.輸入一個文件或者一個標準輸入(stdin),或者是一個“-”連字符()。3.輸出打印在屏幕上4.grep家族擴展命令egrep、fgrep二、 Grep命令的應用1.命令格式grep [選項] 模式 [文件…]例如:grep root /etc/pa…

Python裝飾器的實現原理

Python中的裝飾器是通過利用了函數特性的閉包實現的,所以在說裝飾器之前,我們需要先了解函數特性,以及閉包是怎么利用了函數特性的。 1.函數特性 Python中的函數特性總的來說有四點: 1.函數作為變量傳遞 def add(x):return x 1a add 2.函數…

c語言注釋說明被計算機編譯系統忽略,C語言程序設計(陳艷 2019-2020-2)-中國大學mooc-題庫零氪...

第1章 C語言概述第1講 C語言概述隨堂測驗1、程序 #include void main() { printf("Hello, world!\n"); } 經過編譯運行會在顯示器上輸出 Hello, world! 如果希望輸出:Nice to meet you. 則應使用Nice to meet you.替換( )。A、voidB、mainC、p…

React文檔(五)組件和props

組件可以讓你將UI分割成獨立的,可復用的模塊,然后考慮將每個模塊彼此隔離。從概念上理解,組件就像js中的函數。他們接受隨意的輸入(被稱為props)然后返回React元素來描述屏幕上應該出現什么。 函數式和類式組件 定義一…

Windows 應用容器化

背景 在這個時間點,我們可能已經對 Linux 容器使用已經達到熟練掌握的程度,因為 Docker 與 Kubernetes 都是最早為 Linux 平臺設計。當我們從容器這項技術中體會到種種收益,對于我們的 windows 的應用是否也能利用容器技術簡化我們的開發運維…

python安裝函數庫pip網址_批量安裝python庫函數---pip

android Sqlite小記 1.android.database.sqlite.SQLiteException: near "": syntax error (code 1): 語法錯誤,如果你的報了這個錯誤 ... win8 VB6打開提示MSCOMCTL.ocx未注冊 從xp上復制相應的文件到win8相應的位置,如果是不可以,win8中反注冊此控件,再注…

關于OC中的block自己的一些理解(二)

一、block延伸:頁面間反向傳值 1)first頁面的代碼 - (void)viewDidLoad {[super viewDidLoad];[self setupBtn];self.view.backgroundColor [UIColor whiteColor];} - (void)setupBtn {UIButton * btn [[UIButton alloc]init];[btn addTarget:self act…