1. 程式人生 > >Redis與mysql

Redis與mysql

一:Rdis與mysql的不同

    我們知道,mysql是持久化儲存,存放在磁盤裡面,檢索的話,會涉及到一定的IO,為了解決這個瓶頸,於是出現了快取,比如現在用的最多的 memcached(簡稱mc)。首先,使用者訪問mc,如果未命中,就去訪問mysql(或者有二層快取,那麼訪問二層快取不中之後再訪問資料庫),之後像記憶體和硬碟一樣,把資料複製到mc一部分。

 redis和mc都可以做快取,並且都是駐留在記憶體中執行的,這大大提升了高資料量web訪問的訪問速度。然而mc只是提供了簡單的資料結構,比如 string儲存;redis卻提供了大量的資料結構,比如string、list、set、hashset、sorted set這些,這使得使用者方便了好多,畢竟封裝了一層實用的功能,同時實現了同樣的效果,當然在大多數情況下用redis而慢慢捨棄mc(有些情況還是使用mc更好,根據情況而定)。

 記憶體和硬碟的關係,硬碟放置主體資料用於持久化儲存,而記憶體則是當前執行的那部分資料,CPU訪問記憶體而不是磁碟,這大大提升了執行的速度,當然這是基於程式的區域性化訪問原理。

 推理到redis+mysql,它是記憶體+磁碟關係的一個對映,mysql放在磁碟,redis放在記憶體,這樣的話,web應用每次只訪問redis,如果沒有找到的資料,才去訪問Mysql。

 然而redis+mysql和記憶體+磁碟的用法最好是不同的。
   前者是記憶體資料庫,資料儲存在記憶體中,當然速度快。
   後者是關係型資料庫,功能強大,資料訪問也就慢。
   像memcache,mongoDB,Redis,都屬於Nosql系列。
   不是一個型別的東西,應用場景也不太一樣,還是要看你的需求來決定。

二: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並儲存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中的資料標記為失效,等待下次讀取時再載入。

三:怎麼將Redis作為mysql的快取伺服器

引用博主地址:http://svenman.blog.51cto.com/6867097/1626914

地址:http://blog.sina.com.cn/s/blog_6265c8a10100qrvr.html

http://blog.csdn.net/zhu1289303556/article/details/50839112

相關推薦

淺談RedisMySQL的耦合性以及利用管道完成MySQLRedis的高效遷移

淺談Redis與MySQL的耦合性以及利用管道完成MySQL到Redis的高效遷移     ㈠ Redis 與 MySQL 的耦合性          在業務架構早期、我們便該"吃著碗裡的看著鍋裡的"、切莫讓MyS

redismysql的區別和理論解釋

我們首先先說一下mysql, mysql是可以持久化儲存的關係型資料庫,功能強大,既然涉及到儲存那肯定要涉及到i/o操作(i/o操作就是輸入(Input)和輸出(Output)的意思) 訪問速度相較於非關係型資料會慢很多,為了解決這個問題,於是就出現了快取機制,把一些訪問頻次高的資料快取一部

RedisMySQL中事務的區別

1、mysql中只有使用了InnoDB引擎的資料庫或表才支援事務; 2、使用“事務”的目的是:統一管理insert,update,delete這些寫操作,以此來維護資料的完整性。 事務命令 mysql: begin #顯式地開啟一個事務 commit #提交

redisMysql的資料一致性

為了減少db的讀壓力,加快讀速度,系統使用cache做快取,會引起cache一致性問題。因為db會有事務性導致回滾,而cache無法回滾,會導致髒資料。 一般情況下,我們會在儲存資料時,先穿透儲存到D

Redis】3.RedisMySQL資料一致性的思考

Redis特性 先列舉一下Redis的特點: 讀寫效能優異 持久化 資料型別豐富 單執行緒 資料自動過期 釋出訂閱 分散式 作為快取使用時,一般有兩種方式更新資料: 1、讀取前,先去讀Redis,如果沒有資料,讀取資料庫,將資料拉入Redis。 2、修改資料時

mysql保障資料一致性:redismysql資料同步(二)

應用Redis實現資料的讀寫,同時利用佇列處理器定時將資料寫入mysql,此種情況存在的問題主要是如何保證mysql與redis的資料同步,二者資料同步的關鍵在於mysql資料庫中主鍵,方案是在redis啟動時區mysql讀取所有表鍵值存入redis中,往redis寫資料是

Redis之坑:RedisMySQL中事務的區別

Note: 該篇討論的只是Redis與MySQL中事務的區別,並不能統一代表NO-SQL與關係型SQL; 在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務; 事務使用

Redismysql

一:Rdis與mysql的不同     我們知道,mysql是持久化儲存,存放在磁盤裡面,檢索的話,會涉及到一定的IO,為了解決這個瓶頸,於是出現了快取,比如現在用的最多的 memcached(簡稱mc)。首先,使用者訪問mc,如果未命中,就去訪問mysql(或者有二層快取

redismysql的區別

我們都知道,mysql是持久化儲存,存放在磁盤裡,檢索的話,會涉及到一定的I/O,為了解決這個問題,就出現了快取,首先,使用者訪問網站,如果未命中,就去訪問mysql,之後像記憶體和磁碟一樣,把資料複製到快取中 記憶體與磁碟的關係,磁碟放置主體資料用於持久化儲存,而記憶體則

Redis Mysql通訊

找了點資料看了下。學習心得如下: 1 Mysql更新Redis    Mysql更新Redis借鑑memcache與mysql通訊,利用mysql udf,每有更新操作觸發更新redis操作。不足在高併發時mysql壓力較大,且針對每張表均需增刪改觸發,且Redis伺服器不

REDISMYSQL實現標籤的對比

這裡來演示下REDIS和MYSQL之間的資料轉換問題,REDIS 是典型的KEY -VALUE型NOSQL資料庫,並且提供了額外豐富的資料型別。這裡簡單列舉了標籤型別的應用問題。 比如在MySQL裡面,對內容的標籤有以下簡單的幾張表,我這裡只列出來拆分過後的

某網站RedisMySql同步方案分析

1.編寫目的 某網站專案引入了redis快取技術,如何保證Redis與MySql的資料一致性是開發人員需要首要解決的問題。 本文主要包括以下內容: Redis與MySql的資料一致性方案彙總與選取 Canal解析binlog方案簡介 其他Redi

MySQL之——server保持MySQL的連接

size time var 字段 數據庫操作 操作 登錄 輸入 有一種 轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/47008019 server程序常常要訪問數據庫,而且server程序是長時間保

Solr6.5mysql集成建立索引

file 數據庫數據 -c req cal str syn web-inf 想是 首先在solrconfig.xml(我的是保存在/usr/local/tomcat/solrhome/mycore/conf/下)的<requestHandler name="/sele

13-1 在PHP中使用mysqliMySQL交互

style value free error tor file mysql服務器 del 提示 1.建立、關閉與MySQL服務器的連接 1)連接指定的mysql服務器 [email protected]/* */_connect($host,

oraclemysqlsqlserver的分頁

興趣 href 查詢 lac 博文 簡單的 數據庫 分頁查詢 agen  假設當前是第PageNo頁,每頁有PageSize條記錄,現在分別用Mysql、Oracle和SQL Server分頁查詢student表。 1、Mysql的分頁查詢:  1 SELECT 2

Javamysql數據庫編程中遇見“Before start of result set at com.mysql.jdbc.SQLError.createSQLException” 的解決辦法

statement sql語句 sql數據庫 mark .sql .cn ava 解決 error 轉載:http://www.cnblogs.com/akiradunn/p/5771513.html 這個Bug是因為在取出ResultSet對象,對其進行操作時,沒有

apachemysql添加進系統服務並設置開機啟動

apache與mysql添加進系統服務並設置開機啟動 apache與mysql添加進系統服務並設置開機啟動apache1 cp /usr/local/apache/bin/apachectl /etc/init.d/httpd2 chkconfig --add httpd出現錯誤servi

Sqoop_具體總結 使用Sqoop將HDFS/Hive/HBaseMySQL/Oracle中的數據相互導入、導出

能夠 mes south ase form html 技術 popu 沒有 一、使用Sqoop將MySQL中的數據導入到HDFS/Hive/HBase 二、使用Sqoop將HDFS/Hive/HBase中的數據導出到MySQL 2.3 HBase中的數據

RedisMySQL的結合方案

term eid south http b2c sdn rac tro stub 方案由從易到難的順序,但不管哪種方法。都須要保證的是Reids和MySQL的數據一致性。 方案一: 程序同一時候寫Redis和MySQL 讀Redis 方案二: 程序寫MySQ