1. 程式人生 > 其它 >mysql與redis的區別

mysql與redis的區別

1.mysql和redis的資料庫型別

mysql是關係型資料庫,主要用於存放持久化資料,將資料儲存在硬碟中,讀取速度較慢。

redis是NOSQL,即非關係型資料庫,也是快取資料庫,即將資料儲存在快取中,快取的讀取速度快,能夠大大的提高執行效率,但是儲存時間有限。

2.mysql的執行機制

mysql作為持久化儲存的關係型資料庫,相對薄弱的地方在於每次請求訪問資料庫時,都存在著I/O操作,如果反覆頻繁的訪問資料庫。第一:會在反覆連結資料庫上花費大量時間,從而導致執行效率過慢;第二:反覆的訪問資料庫也會導致資料庫的負載過高,那麼此時快取的概念就衍生了出來。

3.快取

快取就是資料交換的緩衝區(cache),當瀏覽器執行請求時,首先會對在快取中進行查詢,如果存在,就獲取;否則就訪問資料庫。

快取的好處就是讀取速度快

4.redis資料庫

redis資料庫就是一款快取資料庫,用於儲存使用頻繁的資料,這樣減少訪問資料庫的次數,提高執行效率。

5.redis和mysql的區別總結

(1)型別上

從型別上來說,mysql是關係型資料庫,redis是快取資料庫

(2)作用上

mysql用於持久化的儲存資料到硬碟,功能強大,速度較慢,基於磁碟,讀寫速度沒有Redis快,但是不受空間容量限制,價效比高

redis用於儲存使用較為頻繁的資料到快取中,讀取速度快,基於記憶體,讀寫速度快,也可做持久化,但是記憶體空間有限,當資料量超過記憶體空間時,需擴充記憶體,但記憶體價格貴

(3)需求上

mysql和redis因為需求的不同,一般都是配合使用。
需要高效能的地方使用Redis,不需要高效能的地方使用MySQL。儲存資料在MySQL和Redis之間做同步。

Redis持久化
由於Redis的資料都存放在記憶體中,如果沒有配置持久化,redis重啟後資料就全丟失了,於是需要開啟redis的持久化功能,將資料儲存到磁碟上,當redis重啟後,可以從磁碟中恢復資料。redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在記憶體中的資料庫記錄定時dump到磁碟上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日誌以追加的方式寫入檔案)。

RDB
RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,實際操作過程是fork一個子程序,先將資料集寫入臨時檔案,寫入成功後,再替換之前的檔案,用二進位制壓縮儲存。
優點

儲存的檔案是緊湊的

適合用於備份,方便恢復不同版本的資料

適合於容災恢復,備份檔案可以在其他伺服器恢復

最大化了Redis的效能,備份的時候啟動的是子執行緒,父程序不需要執行IO操作

資料儲存比AOF要快

缺點

如果Redis因為沒有正確關閉而停止工作是,到上個儲存點之間的資料將會丟失

由於需要經常fork子執行緒來進行備份操作,如果資料量很大的話,fork比較耗時,如果cpu效能不夠,伺服器可能是卡頓。屬於資料量大的時候,一個伺服器不要部署多個Redis服務。
建立快照有以下5種形式:
1.客戶端傳送BGSAVE指令,服務端會fork一條子執行緒將快照寫入磁碟
2.客戶端傳送SAVE指令,服務端在主執行緒進行寫入動作。一般不常使用,一般在記憶體不夠去執行BGSVAE的時候才用
3.設定了SAVE配置項,如SAVE 300 100,那麼當“300秒內有100次寫入”時,Redus會自動觸發BGSAVE命令。如果有多個配置項,任意一個滿足,都會觸發備份
4.Redis通過SHUTDOWN命令接收到關閉伺服器的請求、或者TERM訊號時,會執行SAVE命令,這時候會阻塞所有客戶端,不在執行客戶端傳送的任何命令
5.當一個Redis伺服器連線另外一個Redis伺服器,並像對方傳送SYNC命令開始一次複製操作時,如果主伺服器目前沒有在執行BGSAVE操作,或者主伺服器剛剛執行完,那麼主伺服器就會執行GBSAVE

AOF
AOF持久化以日誌的形式記錄伺服器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文字的方式記錄,可以開啟檔案看到詳細的操作記錄。
AOF記錄伺服器的所有寫操作。在伺服器重新啟動的時候,會把所有的寫操作重新執行一遍,從而實現資料備份。當寫操作集過大(比原有的資料集還大),Redis 會重寫寫操作集。
優點

使用AOF模式更加的靈活,因為可以有不同的fsync策略

AOF是一個日誌追加檔案,所有不需要定位,就算斷電也沒有損壞問題,哪怕檔案末尾是一個寫到一半的命令,redus-check-aof工具也可以很輕易的修復

當AOF檔案很大的,Redis會自動在後臺進行重寫。重寫是決對安全的,因為Redis是繼續往舊的檔案裡面追加,使用建立當前資料集所需的最小操作集合來建立一個全新的檔案,一旦建立完成,Redis就會切換到新檔案,開始往新檔案進行追加操作

AOF包含一個又一個的操作命令,易於理解和解析
缺點

對於同樣的資料集,AOF檔案通常要大於RDB檔案

AOF可能比RDB要慢,這取決於fsync策略。通常fsync設定為每秒一次的話效能仍然很高,如果關閉sfync,即使在很高的負載下也和RDB一樣快。不過,即使在很大的寫負載情況下,RDB還是能提供很好的最大延遲保證

AOF通過遞增的方式更新資料,而RDB快照是從頭開始建立,RDB會更健壯和穩定(所以適用於備份)

Redis的持久化策略

RDB(資料快照模式),定期儲存,儲存的是資料本身,儲存檔案是緊湊的

AOF(追加模式),每次修改資料時,同步到硬碟(寫操作日誌),儲存的是資料的變更記錄

如果只希望資料儲存在記憶體中的話,倆種策略都可以關閉

也可以同時開啟倆種策略,當Redis重啟時,AOF檔案會用於重建原始資料

Redis實現定時任務
Publish / Subscribe
Redis 在 2.0.0 之後推出了 Pub / Sub 的指令,大致就是說一邊給 Redis 的特定頻道傳送訊息,另一邊從 Redis 的特定頻道取值——形成了一個簡易的訊息佇列

Redis Keyspace Notifications
在 Redis 裡面有一些事件,比如鍵到期、鍵被刪除等。然後我們可以通過配置一些東西來讓 Redis 一旦觸發這些事件的時候就往特定的 Channel 推一條訊息。注意: Redis的釋出/訂閱閱後即焚是不支援持久化的, 故如果客戶端斷開重連則在這期間的訊息將丟失!

Redis分散式鎖
首先,為了確保分散式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件:
互斥性。在任意時刻,只有一個客戶端能持有鎖。
不會發生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證後續其他客戶端能加鎖。
具有容錯性。只要大部分的Redis節點正常執行,客戶端就可以加鎖和解鎖。
解鈴還須繫鈴人。加鎖和解鎖必須是同一個客戶端,客戶端自己不能把別人加的鎖給解了。Redis分散式鎖流程如下:

    • 在實現的時候要注意的幾個關鍵點:
      1、鎖資訊必須是會過期超時的,不能讓一個執行緒長期佔有一個鎖而導致死鎖;
      2、同一時刻只能有一個執行緒獲取到鎖。

    • 多寫Redis

      說明:
      元件名叫YeeRedisGroup,基本服務主要有四個,當資料到來的時候,會分別插入二個Redis服務,這二個Redis服務採用的是異地雙活的方案,當其中一個Redis服務掛了以後,會將這個Redis服務從可用佇列中摘除,放入重試佇列中,另一個Redis則會繼續使用。同樣讀取Redis的時候只會從可用佇列中讀取第一個Redis服務繼續讀取。

      Redis的超時刪除
      ·定時刪除:在設定鍵的過期時間的同時,建立一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。
      ·惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。

      ·定期刪除:每隔一段時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵。至於要刪除多少過期鍵,以及要檢查多少個數據庫,則由演算法決定。

      在這三種策略中,第一種和第三種為主動刪除策略,而第二種則為被動刪除策略。

      Redis採用的過期策略:惰性刪除+定期刪除

      惰性刪除流程
      在進行get或setnx等操作時,先檢查key是否過期,
      若過期,刪除key,然後執行相應操作;
      若沒過期,直接執行相應操作
      定期刪除流程(簡單而言,對指定個數個庫的每一個庫隨機刪除小於等於指定個數個過期key)
      遍歷每個資料庫(就是redis.conf中配置的"database"數量,預設為16)
      檢查當前庫中的指定個數個key(預設是每個庫檢查20個key,注意相當於該迴圈執行20次,迴圈體時下邊的描述)
      如果當前庫中沒有一個key設定了過期時間,直接執行下一個庫的遍歷
      隨機獲取一個設定了過期時間的key,檢查該key是否過期,如果過期,刪除key
      判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。

      RDB對過期key的處理
      過期key對RDB沒有任何影響
      從記憶體資料庫持久化資料到RDB檔案
      持久化key之前,會檢查是否過期,過期的key不進入RDB檔案
      從RDB檔案恢復資料到記憶體資料庫
      資料載入資料庫之前,會對key先進行過期檢查,如果過期,不匯入資料庫(主庫情況)
      AOF對過期key的處理
      過期key對AOF沒有任何影響
      從記憶體資料庫持久化資料到AOF檔案:
      當key過期後,還沒有被刪除,此時進行執行持久化操作(該key是不會進入aof檔案的,因為沒有發生修改命令)
      當key過期後,在發生刪除操作時,程式會向aof檔案追加一條del命令(在將來的以aof檔案恢復資料的時候該過期的鍵就會被刪掉)
      AOF重寫
      重寫時,會先判斷key是否過期,已過期的key不會重寫到aof檔案