1. 程式人生 > >使用Redis做MySQL的快取

使用Redis做MySQL的快取

1 為什麼使用快取

當網站的處理和訪問量非常大的時候,我們的資料庫的壓力就變大了,資料庫的連線池,資料庫同時處理資料的能力就會受到很大的挑戰,一旦資料庫承受了其最大承受能力,網站的資料處理效率就會大打折扣。此時就要使用高併發處理、負載均衡和分散式資料庫,而這些技術既花費人力,又花費資金。

2 使用場景

頁面快取經常用在CMS(content manage system)記憶體管理系統裡面。

這裡寫圖片描述
資料快取經常會用在頁面的具體資料裡面。

3 Redis快取原理

Redis其實就是說把表中經常訪問的記錄放在了Redis中,然後使用者查詢時先去查詢Redis再去查詢MySQL,確實實現了讀寫分離,也就是Redis只做讀操作。由於快取在記憶體中,所以查詢會很快。

如何確定在redis查詢還是Mysql查詢:對於一個sql語句格式的資料請求,首先計算該語句的MD5並據此得到結果集識別符號,然後利用該識別符號在Redis中查詢該結果集。注意,結果集中的每一行都有一個相應的鍵,這些鍵都儲存在一個Redis集合結構中。如果Redis中不存在這樣一個集合,說明要找的結果集不在Redis中,所以需要執行相應的sql語句,在Mysql中查詢到相應的結果集,然後按照上面所說的辦法把結果集中的每一行以字串或雜湊的形式存入Redis。

4 其他快取策略

Redis+MySQL實現了讀寫分離,但是MySQL本身也可以讀寫分離,也就是分散式。另外,實現快取的方式也有很多:MYSQL自帶的快取;DAO框架的快取等。
方法一:直接用Mysql


這種事情首先Mysql裡面就有快取,實現了類似的功能,如果需要快取的東西很多,你可以把快取的記憶體設定大一點。這樣的好處就是你不用自己去控制快取的失效,確保資料一致性。
MySQL查詢會造成記憶體碎片等問題,請參考:http://blog.csdn.net/songjianyue12345/article/details/77340168

方法二:啟用DAO框架的快取
比如Mybatis、Hibernate都是可以直接開啟二級快取,一般是用ehcache作為實現,你只要配置一下就行,無需額外操作。

方法三:自己實現
用AOP去在Dao層做一個切面,把呼叫的“類名+方法名+引數”作為key,查詢結果作為value,每次呼叫去看一下是否已經快取了,如果沒有再去呼叫Dao的實現類。

5 選擇Memcatched還是Redis

1.效能上
效能上都很出色,具體到細節,由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在儲存小資料時比
Memcached效能更高。而在100k以上的資料中,Memcached效能要高於Redis,雖然Redis最近也在儲存大資料的效能上進行優化,但是比起 Memcached,還是稍有遜色。

2.記憶體空間和資料量大小
MemCached可以修改最大記憶體,採用LRU演算法。Redis增加了VM的特性,突破了實體記憶體的限制。

3.操作便利上
MemCached資料結構單一,僅用來快取資料,而Redis支援更加豐富的資料型別,也可以在伺服器端直接對資料進行豐富的操作,這樣可以減少網路IO次數和資料體積。

4.可靠性上
MemCached不支援資料持久化,斷電或重啟後資料消失,但其穩定性是有保證的。Redis支援資料持久化和資料恢復,允許單點故障,但是同時也會付出效能的代價。

5.應用場景
Memcached:動態系統中減輕資料庫負載,提升效能;做快取,適合多讀少寫,大資料量的情況(如人人網大量查詢使用者資訊、好友資訊、文章資訊等)。
Redis:適用於對讀寫效率要求都很高,資料處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博釋出部分系統,對資料安全性、讀寫要求都很高)。
請參考:https://www.cnblogs.com/work115/p/5584646.html

6 如何使用Redis做快取

用Redis作Mysql資料庫快取,必須解決2個問題。首先,應該確定用何種資料結構儲存來自Mysql的資料;在確定資料結構之後,還要考慮用什麼標識作為該資料結構的鍵。
直觀上看,Mysql中的資料都是按表儲存的;更微觀地看,這些表都是按行儲存的。每執行一次select查詢,Mysql都會返回一個結果集,這個結果集由若干行組成。所以,一個自然而然的想法就是在Redis中找到一種對應於Mysql行的資料結構。Redis中提供了五種基本資料結構,即字串(string)、列表(list)、雜湊(hash)、集合(set)和有序集合(sorted set)。經過調研,發現適合儲存行的資料結構有兩種,即string和hash。
要把Mysql的行資料存入string,首先需要對行資料進行格式化。事實上,結果集的每一行都可以看做若干由欄位名和其對應值組成的鍵值對集合。這種鍵值對結構很容易讓我們想起Json格式。因此,這裡選用Json格式作為結果集每一行的格式化模板。根據這一想法,我們可以實現將結果集格式化為若干Json物件,並將Json物件轉化為字串存入Redis的程式碼。
請參考:https://www.cnblogs.com/jinjiangongzuoshi/p/5240300.html