使用Redis做MySQL的快取

2021-09-11 14:37:23 字數 2514 閱讀 6059

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查詢會造成記憶體碎片等問題,請參考:

方法二:啟用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支援資料持久化和資料恢復,允許單點故障,但是同時也會付出效能的代價。

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的**。

請參考:

Mysql Cache配置使用 mysql快取配置

如果 mysql server 負載比較高,處理非常繁忙的話,可以啟動query cache 以加速響應時間,啟動方法可以在my.cnf linux 或my.ini windows 中加入不以下專案 redhat下面是 etc my.cnf debian和ubuntu是在 etc mysql my....

springboot使用redis做快取

org.springframework.bootgroupid spring boot starter data redisartifactid dependency redis host 121.89.192.157 port 6379 jedis pool max active 25 max i...

怎麼使用redis做次數的限制

筆者在實際開發中,總能遇到一些 對驗證次數的限制,比如 驗證身份證這種api 由於是收費的,為了防止惡意的提交身份證,所以 限制住是很重要的,分布式的系統中要麼用 zookeeper 要麼redis 這種沒必要使用資料庫去實現,首先 已進入方法時,馬上判斷 這個 id 是否 有 達到 3次的限制 p...