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文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM