mysql與redis區別

ff0d580474704e90a654c363d9e2987e.jpgmysql和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文件

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡

mcq Java 傳輸層:拆分和組裝,完成端到端的消息傳遞,流量控制,差錯控制等 網絡層: 尋址、路由,復用,擁塞控制,完成源到宿的傳遞。 顯然A選項是錯誤的,有流量控制的是傳輸層…

JavaScript TypeScript

文章目錄 JavaScript語法事件處理與HTML和CSS集成前端框架和庫 TypeScript靜態類型檢查語法更好的可維護性 包管理工具npmpnpmyarnBower JavaScript JavaScript(簡稱JS)是一種廣泛應用于網頁開發的腳本語言。它被用來為網頁增加交互性和動態功能。以下是…

netty學習分享(一)

TCP與UDP TCP 是面向連接的、可靠的流協議,通過三次握手建立連接,通訊完成時要拆除連接。 UDP是面向無連接的通訊協議,UDP通訊時不需要接收方確認,屬于不可靠的傳輸,可能會出現丟包現象 端口號: 端口號用…

【微信小程序】記一次自定義微信小程序組件的思路

最近來個需求,要求給小程序的 modal 增加個關閉按鈕,上網一查發現原來 2018 年就有人給出解決方案了,于是總結下微信小程序自定義組件的思路:一句話,用 wxml css實現和原生組件類似的樣式和效果,之后用 JS…

【uniapp】uniapp設置安全區域:

文章目錄 一、效果圖:二、實現代碼: 一、效果圖: 二、實現代碼: {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitle…

消息隊列學習筆記

消息隊列基礎 適合消息隊列解決的問題 異步處理:處理完關鍵步驟后直接返回結果,后續放入隊列慢慢處理流量控制: 使用消息隊列隔離網關和后端服務,以達到流量控制和保護后端服務的目的。能根據下游的處理能力自動調節流量&#x…

leetcode做題筆記79單詞搜索

給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相…

Matlab工具NIFTI包的基本功能函數

Matlab工具NIFTI包的基本功能函數 Nifti 格式最初是為神經影像學發明的。神經影像信息學技術計劃(NIFTI)將 NIfTI 格式預設為 ANALYZE7.5 格式的替代品。它最初的應用領域是神經影像,但是也被用在其他領域。這種格式的主要特點就是它包含兩個…

Docker基礎入門:常規軟件安裝與鏡像加載原理

Docker基礎入門:常規軟件安裝與鏡像加載原理 一、Docker常規軟件安裝1.1、部署nginx1.2、部署tomcat1.3、部署elasticsearch1.4、如何部署kibana-->連接elasticsearch1.5、部署可視化工具 二、 鏡像加載原理2.1、鏡像是什么2.2、Docker鏡像加速原理2.3、分層理解…

為什么我的集群一個 Spark Executor / Yarn Container 只分配一個vCore?

在很多集群里,在關閉了Spark的DynamicAllocation的前提下(避免自動申請空閑資源,干擾測試結果),都會觀察到:提交Spark作業時,申請 1 個 driver + n 個 executor 會在Yarn上對應創建 n+1 個 container,但是每個container只有一個vCore,通過--driver-cores和--executor-…

Grafana Prometheus 通過JMX監控kafka 【2023最新方式】

第三方kafka exporter方案 目前網上關于使用Prometheus 監控kafka的大部分資料都是使用一個第三方的 kafka exporter,他的原理大概就是啟動一個kafka客戶端,獲取kafka服務器的信息,然后提供一些metric接口供Prometheus使用,隨意它…

docker 安裝mysql8.0

1、拉取鏡像 docker pull mysql2、運行鏡像 docker run -d --restartalways --name mysql --privilegedtrue -p 3306:3306 -v /home/sunyuhua/docker/mysql/data:/var/lib/mysql -v /home/sunyuhua/docker/mysql/conf:/etc/mysql/conf.d -v /home/sunyuhua/docker/mysql/logs…

07_Hudi案例實戰、Flink CDC 實時數據采集、Presto、FineBI 報表可視化等

7.第七章 Hudi案例實戰 7.1 案例架構 7.2 業務數據 7.2.1 客戶信息表 7.2.2 客戶意向表 7.2.3 客戶線索表 7.2.4 線索申訴表 7.2.5 客戶訪問咨詢記錄表 7.3 Flink CDC 實時數據采集 7.3.1 開啟MySQL binlog 7.3.2 環境準備 7.3.3 實時采集數據 7.3.3.1 客戶信息表 7.3.3.2 客戶…

ubuntu安裝jdk、emqx、nginx

一、安裝jdk 要在Ubuntu上安裝JDK 1.8,您可以按照以下步驟進行操作: 打開終端(CtrlAltT)。確保您的系統已更新: sudo apt update sudo apt upgrade安裝OpenJDK 8: sudo apt install openjdk-8-jdk安裝完成…

.net core發布到IIS上出現 HTTP 錯誤 500.19

1.檢查.net core 環境運行環境是否安裝完成,類似如下環境 2.IIS是否安裝全 本次原因就是IIS未安裝全導致的 按照網上說的手動重啟iis(iisreset)也不行

基于C#的消息處理的應用程序 - 開源研究系列文章

今天講講基于C#里的基于消息處理的應用程序的一個例子。 我們知道,Windows操作系統的程序是基于消息處理的。也就是說,程序接收到消息代碼定義,然后根據消息代碼定義去處理對應的操作。前面有一個博文例子( C#程序的啟動顯示方案(無窗口進程發…

【數據結構】 ArrayList簡介與實戰

文章目錄 什么是ArrayListArrayList相關說明 ArrayList使用ArrayList的構造無參構造指定順序表初始容量利用其他 Collection 構建 ArrayListArrayList常見操作獲取list有效元素個數獲取和設置index位置上的元素在list的index位置插入指定元素刪除指定元素刪除list中index位置上…

機器學習基礎(二)

線性回歸 誤差是獨立并且具有相同的分布通常認為服從均值為0方差為的高斯分布。 損失函數(loss Function)/代價函數(Cost Function) 其實兩種叫法都可以,損失函數(loss function)或代價函數(cost function)是將隨機事件或其有關隨機變量的取值映射為非負實數以表示該隨…

Android開發之性能優化:過渡繪制解決方案

1. 過渡繪制 屏幕上某一像素點在一幀中被重復繪制多次,就是過渡繪制。 下圖中多個卡片跌在一起,但是只有第一個卡片是完全可見的。背后的卡片只有部分可見。但是Android系統在繪制時會將下層的卡片進行繪制,接著再將上層的卡片進行繪制。但其…

springcloud3 hystrix實現服務降級的案例配置2

一 服務降級的說明 1.1 服務降級說明 "服務器忙,請稍后在試"不讓客戶達等待,立即返回一個友好的提示。 1.2 服務降級的觸發情況 1.程序運行異常; 2.超時; 3.服務熔斷觸發服務降級;4 .線程池/信號量打…