Redis持久化RDB,AOF

目? ?錄

CONFIG動態修改配置

慢查詢

持久化


在上一篇主要對redis的了解入門,安裝,以及基礎配置,多實例的實現:redis的安裝看我上一篇:

Redis安裝部署與使用,多實例

redis是擋在MySQL前面的,運行在內存中的,速度就快,單線程的。

redis的一些基礎配置:

在上一篇redis介紹中,介紹了bind配置,使得遠端主機能夠登錄本機redis。密碼requirepass的設置,以及多實例基于端口號port的配置,pid文件pidfile,日志文件logfile,工作目錄dbfilename配置。

bind 0.0.0.0 #監聽地址,可以用空格隔開后多個監聽IP

port 6379 #監聽端口,默認6379/tcp

tcp-keepalive 300 #tcp 會話保持時間300s

daemonize no #默認no,即直接運行redis-server程序時,不作為守護進程運行,而是以前臺方式運行,如果想在后臺運行需改成yes,當redis作為守護進程運行的時候,它會寫一個 pid 到/var/run/redis.pid 文件

pidfile /var/run/redis_6379.pid #pid文件路徑,可以修改為/apps/redis/run/redis_6379.pid

loglevel notice #日志級別
logfile "/path/redis.log" #日志路徑,示例:logfile "/apps/redis/log/redis_6379.log"databases 16 #設置數據庫數量,默認:0-15,共16個庫

save 900 1 #在900秒內有1個key內容發生更改,就執行快照機制
save 300 10 #在300秒內有10個key內容發生更改,就執行快照機制
save 60 ?10000 ?#60秒內如果有10000個key以上的變化,就自動快照備份

rdbcompression yes #持久化到RDB文件時,是否壓縮,"yes"為壓縮,"no"則反之

dbfilename dump.rdb #快照文件名

dir ./ #快照文件保存路徑,示例:dir "/apps/redis/data"

maxclients 10000 #Redis最大連接客戶端

appendfilename "appendonly.aof" #文本文件AOF的文件名,存放在dir指令指定的目錄中

appendfsync everysec

#aof持久化策略的配置
#no表示由操作系統保證數據同步到磁盤,Linux的默認fsync策略是30秒,最多會丟失30s的數據
#always表示每次寫入都執行fsync,以保證數據同步到磁盤,安全性高,性能較差
#everysec表示每秒執行一次fsync,可能會導致丟失這1s數據,此為默認值,也生產建議值

auto-aof-rewrite-min-size 64mb #觸發aof rewrite的最小文件大小

cluster-enabled yes #是否開啟集群模式,默認不開啟,即單機模式

CONFIG動態修改配置

config命令用于查看當前redis配置、以及不重啟redis服務實現動態更改redis配置等

注意:不是所有配置都可以動態修改,且此方式無法持久保存

CONFIG SET <parameter> <value>

config set 參數 值

config set 參數值。時間復雜度是O(1)。CONFIG SET 命令可以動態調整redis服務器的配置(confuiguration)而無須重啟。

也可以使用它修改配置參數,或者改變redis的持久化(persistence)方式

CONFIG SET 可以修改的配置命令可以使用命令CONFIG GET * 來列出來,所有被CONFIG SET 修改的配置參數都會立即生效。

CONFIG GET 命令用于取得運行中的redis服務器的配置參數(configuration parameters),在redis2.4版本中,有部分參數沒有辦法用config get訪問,但是在最新的Redis2.6版本中,所有配置參數都已經可以用config get訪問了。

config get 接受單個參數parameter作為搜索關鍵字,查找到所有匹配的配置參數,其中參數和值以鍵值對的方式排列。

比如執行config get s* 命令,服務器會返回所有以s開頭的配置參數及參數值的。

案例:

登錄redis:

[root@Node1 ~]#:redis-cli

?使用動態方式查看日志文件路徑:

查看以lo開頭的配置項:

顯示出了有日志文件路徑,和日志級別。

相當于:Python中以字典的形式存儲

{logfile:"/apps/redis/log/redis.log",loglevel:"notice"}

config設置密碼:

127.0.0.1:6379> config set requirepass 12321
OK

?可以看到,必須使用密碼登錄,-a選項

設置空密碼:

慢查詢

執行命令,有發送命令,排隊等待命令的執行,執行命令,返回結果。

慢查詢發生在第3階段,客戶端超時不一定慢查詢,但是慢查詢時客戶端超時的一個可能因素。

范例:slowlog。修改兩條配置:

slowlog-log-slower-than 1 ???#指定為超過1us即為慢的指令
slowlog-max-len 1024 ????????#指定保存1024條慢記錄

?指定為超過1微妙即為慢的指令

指定保存1024條慢記錄

?查看慢查詢具體情況,看前兩條

發現記錄了我們輸入命令查詢的語句。

如果get后面不加數字,就是查看全部:

數據庫:切換使用select 0,select 1。。。 當前默認是0,

進入數據庫使用select 1
在當前設置鍵值:

切換到數據庫1:

獲取不到在0上的name。再切換回去就有了

在1上也設置一個name:

使用flushdb命令可以清空當前的數據庫

flushall清空所有的數據庫

這里清空之后我們再重新設置一個name,叫python。去0上查看name為linux。執行flushall命令清空所有,再回來1上,查看name=python是否被清空。

flushdb清空當前數據庫,flushall清空所有數據庫。

持久化

redis雖然是一個內存級別的緩存程序,也就是redis是使用內存進行數據的緩存的,但是其可以將內存的數據按照一定的策略保存到硬盤上,從而實現數據持久保存的目的,目前支持redis支持兩種不同的方式的數據持久化保存機制,分別是RDB和AOF。

持久化的功能:redis是內存數據庫,所有數據都是保存在內存中,為了避免服務器斷點等原因導致redis進程異常退出后數據永久丟失,需要定期將redis中的數據以某種形式(數據或者命令)從內存中保存到硬盤上,當下次redis重啟時,利用持久化文件實現數據恢復,除此之外為了進行災難備份,可以持久化將文件拷貝到一個遠程位置(如備份服務器)。

redis提供兩種方式進行持久化:

RDB持久化:原理是將redis在內存中的數據庫記錄,定時保存到磁盤上,類似于快照。

AOF持久化:原理是將redis的操作日志以追加的方式寫入文件,類似于mysql的binlog

由于AOF持久性實時性更好,即發生特殊情況導致數據丟失時,丟失的數據更少,因此是目前主流的持久化方式,不過RDB持久化仍然具有可用性。

保存持久化:

當一個鍵設置了多個值,那么get獲取鍵時對應的值就是最近一次的修改。

127.0.0.1:6379> set name linux
OK
127.0.0.1:6379> set name linux1
OK
127.0.0.1:6379> set name linux2
OK
127.0.0.1:6379> get name
"linux2"
127.0.0.1:6379>

那么前面設置的兩個值就會殘留。占用空間。使用save可以保存持久化。還有一個是bgsave,它不會影響操作,后臺執行,不影響操作。重寫機制會把最近的記錄下載,也就是記錄linux3。

建議使用bgsave

持久化中:

dir ./ #快照文件保存路徑,示例:dir "/apps/redis/data"。如果不指定,在登錄redis時,save會出現錯誤

dbfilename dump.rdb #快照文件名
appendfilename "appendonly.aof" 和rdb文件共用dir aof保存文件的名字

兩個保存文件共用dir中指定的目錄

AOF默認是關閉的,在配置文件中開啟appendonly

RDB模式:基于時間快照,其默認只保留當前最新的一次快照,特點是執行速度比較快,缺點是可能會丟失從上次快照到當前時間點之間未做快照的數據。

RDB bgsave實現快照的具體過程:

Redis從master主進程先fork出一個子進程,使用寫時復制機制,子進程將內存的數據保存為一個臨時文件,比如:tmp-.rdb,當數據保存完成之后再將上一次保存的RDB文件替換掉,然后關閉子進程,這樣可以保證每一次做RDB快照保存的數據都是完整的因為直接替換RDB文件的時候,可能會出現突然斷電等問題,而導致RDB文件還沒有保存完整就因為突然關機停止保存,而導致數據丟失的情況.后續可以手動將每次生成的RDB文件進行備份,這樣可以最大化保存歷史數據

RDB持久化觸發條件分為手動觸發和自動觸發兩種:

手動觸發:save命令和bgsave命令都可以生成RDB文件。

save命令會阻塞redis服務器進程,直到RDB文件創建完畢為止,在redis服務器阻塞期間,服務器不能處理任何命令請求。

而bgsave命令會創建一個子進程,由子進程來負責創建RDB文件,父進程(即redis主進程)則繼續處理請求。

bgsave命令執行過程中,只有fork子進程時會阻塞服務器,而對于save命令,整個過程都會阻塞服務器,因此save已基本被廢棄,線上環境要杜絕save的使用。往往生產環境bgsave依然不允許輕易使用。

自動觸發:

在自動觸發RDB持久化時,redis也會選擇bgsave而不是save來進行持久化。

save m n

自動觸發最常見的情況是在配置文件中通過save m n,指定當m秒內發生n次變化時,會觸發bgsave。

自動觸發:兩個條件都要滿足在60秒內,觸發兩次數據變化才會啟動保存。

相關配置:

save 900 1 ????????#900s內修改了1個key即觸發保存RDB
save 300 10 ???????#300s內修改了10個key即觸發保存RDB
save 60 10000 ?????#60s內修改了10000個key即觸發保存RDB

dbfilename dump.rdb
dir ./ ????????#編澤編譯安裝,默認RDB文件存放在啟動redis的工作目錄,建議明確指定存入目錄stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

備份操作,執行save的時候注意配置文件,dir指定為/apps/redis/data/下。

可以同時執行保存命令和查看進程,可以看到如圖所示;

自動觸發:

修改配置文件
#save 900 1
#save 300 10
#save 60 10000
save 60 2

bgsave 在后臺備份的時候不知道什么時候完成

[root@Node1 redis]#:redis-cli bgsave ;redis-cli info Persistence |grep rdb_bgsave_in_progress
Background saving started
rdb_bgsave_in_progress:1
[root@Node1 redis]#:
[root@Node1 redis]#:redis-cli info Persistence |grep rdb_bgsave_in_progress
rdb_bgsave_in_progress:0

RDB的優缺點:

優點:

1.RDB快照保存了某個時間點的數據,可以通過腳本執行redis指令bgsave(非阻塞,后臺執行)或者save(會阻塞寫操作,不推薦)命令自定義時間點備份,可以保留多個備份,當出現問題可以恢復到不同時間點的版本,很適合備份,并且此文件格式也支持有不少第三方工具可以進行后續的數據分析比如: 可以在最近的24小時內,每小時備份一次RDB文件,并且在每個月的每一天,也備份一個RDB文件。這樣的話,即使遇上問題,也可以隨時將數據集還原到不同的版本。

缺點:

2.RDB可以最大化Redis的性能,父進程在保存 RDB文件時唯一要做的就是fork出一個子進程,然后這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤 I/O 操作。

3.RDB在大量數據,比如幾個G的數據,恢復的速度比AOF的快

1.不能實時保存數據,可能會丟失自上一次執行RDB備份到當前的內存數據如果你需要盡量避免在服務器故障時丟失數據,那么RDB并不適合。雖然Redis允許設置不同的保存點(save point)來控制保存RDB文件的頻率,但是,因為RDB文件需要保存整個數據集的狀態,所以它并不是一個輕松快速的操作。因此一般會超過5分鐘以上才保存一次RDB文件。在這種情況下,一旦發生故障停機,你就可能會丟失好幾分鐘的數據。

2.當數據量非常大的時候,從父進程fork子進程進行保存至RDB文件時需要一點時間,可能是毫秒或者秒,取決于磁盤IO性能在數據集比較龐大時,fork()可能會非常耗時,造成服務器在一定時間內停止處理客戶端﹔如果數據集非常巨大,并且CPU時間非常緊張的話,那么這種停止時間甚至可能會長達整整一秒或更久。雖然 AOF重寫也需要進行fork(),但無論AOF重寫的執行間隔有多長,數據的持久性都不會有任何損失。

AOF模式:

AOF:按照操作順序依次將操作追加到指定的日志文件末尾。

AOF和RDB一樣使用了寫時復制機制,AOF默認為每秒鐘fsync一次,即將執行的命令保存到AOF文件當中,這樣即使redis服務器發生故障最多只丟失1秒中之內的數據,也可以設置不同的fsync策略always,即設置每次執行命令的時候執行fsync,fsync會在后臺執行線程,所以主線程可以繼續處理用戶的正常請求而不受到寫入AOF文件的影響。

同時啟用RDB和AOF,進行恢復時,默認AOF文件優先級高于RDB文件,即會使用AOF文件進行恢復。

注意:AOF模式默認是關閉的,第一次開啟AOF后,并重啟服務生效后,會因為AOF的優先級高于RDB,而先恢復AOF文件

AOF默認沒有數據文件存在,從而導致所有數據丟失。

是否開啟AOF

appendonly no #是否開啟AOF日志記錄,默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了,但是redis如果中途宕機,會導致可能有幾分鐘的數據丟失(取決于dump數據的間隔時間),根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性,Redis會把每次寫入的數據在接收后都寫入 appendonly.aof 文件,每次啟動時Redis都會先把這個文件的數據讀入內存里,先忽略RDB文件。默認不啟用此功能

開啟后重啟,默認是與RDB在一個路徑下:

數據發生修改后,會自動記錄:

保存規則:

everysec表示每秒執行一次fsync,可能會導致丟失這1s數據,此為默認值,也生產建議值。

重寫規則,rewrite相關。

no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100?
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes

當如果同時開啟了AOF和RDB是如何正確恢復:

AOF優先級比RDB要高。

同時開啟只會同步AOF文件。

AOF重寫機制

將一些重復的,可以合并的,過期的數據重新寫入一個新的AOF文件,從而節約AOF備份占用的硬盤空間,也能加速恢復過程

可以手動執行 bgrewriteaof 觸發AOF,第一次開啟AOF功能,或定義自動 rewrite 策略

---end---

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

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

相關文章

Week 6-楊帆-學習總結

- 46 語義分割和數據集 語義分割概念 語義分割是一種計算機視覺任務&#xff0c;其目標是將圖像分割成屬于不同語義類別的區域。與目標檢測不同&#xff0c;語義分割關注的是像素級別的標注和預測&#xff0c;能夠識別并理解圖像中每一個像素的內容。這使得語義分割在理解圖像…

產品經理-研發流程-敏捷開發-迭代-需求評審及產品規劃(15)

敏捷開發是以用戶的需求進化為核心&#xff0c;采用迭代、循序漸進的方法進行軟件開發。 通俗來說&#xff0c;敏捷開發是一個軟件開發流程&#xff0c;是一個采用了迭代方法的開發流程 簡單來說&#xff0c;迭代就是把一個大產品拆分出一些最小的實現單位。完成不同的迭代就最…

機器學習筑基篇,Jupyter Notebook 精簡指南

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 簡明指南 描述&#xff1a;前面我們已經在機器學習工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安裝 Anaconda 工具包&#xff0c;其…

老物件線上3D回憶展拓寬了藝術作品的展示空間和時間-深圳華銳視點

在數字技術的浪潮下&#xff0c;3D線上畫展為藝術家們開啟了一個全新的展示與銷售平臺。這一創新形式不僅拓寬了藝術作品的展示空間&#xff0c;還為廣大觀眾帶來了前所未有的觀賞體驗。 3D線上畫展制作以其獨特的互動性&#xff0c;讓藝術不再是單一的視覺享受。在這里&#x…

數據處理-Matplotlib 繪圖展示

文章目錄 1. Matplotlib 簡介2. 安裝3. Matplotlib Pyplot4. 繪制圖表1. 折線圖2. 散點圖3. 柱狀圖4. 餅圖5. 直方圖 5. 中文顯示 1. Matplotlib 簡介 Matplotlib 是 Python 的繪圖庫&#xff0c;它能讓使用者很輕松地將數據圖形化&#xff0c;并且提供多樣化的輸出格式。 Ma…

如何定義版本號--語義化版本

前言 版本號(version number)是版本的標識號。每一個操作系統&#xff08;或廣義的講&#xff0c;每一個軟件&#xff09;都有一個版本號。版本號能使用戶了解所使用的操作系統是否為最新的版本以及它所提供的功能與設施。 例如在Python項目依賴中會看到 requires-python &q…

zdppy+onlyoffice實現重命名文件的功能

參考文檔&#xff1a;https://api.onlyoffice.com/zh/editors/rename 步驟圖&#xff1a; 實現步驟&#xff1a; 用戶在 文檔編輯器中為文檔指定一個新名稱。 文檔編輯器 將文檔的新名稱通知給 文檔管理器。 文檔管理器 將文檔的新名稱發送到 文檔存儲服務&#xff0c;在這里…

使用jsencrypt在web前端對字符串進行Ras加密

話不多說&#xff0c;上代碼 實例代碼 下面方法&#xff0c;在網頁中先引入jsencrypt.min.js。然后調用ToEncrypt方法示例輸出加密&#xff0c;解密后的結果。 <script src"/js/jsencrypt.min.js"></script> //加密測試function ToEncrypt(){// 假設…

synchronized關鍵字詳解

文章目錄 synchronized使用示例實現原理鎖的升級synchronized與可見性synchronized與原子性synchronized與有序性 synchronized synchronized是Java提供的關鍵字譯為同步&#xff0c;是Java中用于實現線程同步的一種機制。它可以確保在同一時間只有一個線程能夠執行某段代碼&a…

【Python系列】數字的bool值

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

泌尿系統疾病病人的護理

一、泌尿系統疾病病人的一般護理要點 對于泌尿系統疾病的病人&#xff0c;護理是至關重要的。首先&#xff0c;要密切觀察病人的生命體征&#xff0c;包括體溫、脈搏、呼吸和血壓。 飲食方面&#xff0c;應根據病人的具體病情進行調整。例如&#xff0c;對于有水腫的病人&#…

js登陸驗證

當開始制作網頁時&#xff0c;就需要做一個判斷&#xff0c;不管在第幾頁進入&#xff0c;都要加一個登陸驗證&#xff0c;只有用戶有賬號&#xff0c;才能進入網頁&#xff0c;瀏覽網頁信息。下面就來看一下&#xff0c;使用JavaScript幾行代碼實現登陸驗證。 首先 登錄頁是i…

vue父組件樣式穿透修改子組件樣式

在 Vue 中&#xff0c;使用父組件樣式穿透到子組件通常不推薦&#xff0c;因為它破壞了樣式的作用域隔離&#xff0c;但如果你確實需要這樣做&#xff0c;可以使用深度選擇器。Vue 2 使用 ::v-deep&#xff0c;而 Vue 3 使用 /deep/ 或 ::v-deep 都可以。 以下是使用深度選擇器…

MVC之 IHttpModule管道模型《二》

》》》注意&#xff1a;在http請求的處理過程中&#xff0c;只能調用一個HttpHandler&#xff0c;但可以調用多個HttpModule。 HTTP Modules ASP.NET請求處理過程是基于管道模型的&#xff0c;這個管道模型是由多個HttpModule和HttpHandler組成&#xff0c;當請求到達HttpMod…

java-mysql-insert 操作

在 Java 中&#xff0c;使用 JDBC 插入數據到 MySQL 數據庫是非常常見的操作。以下是一個詳細的步驟&#xff0c;展示如何使用 JDBC 插入數據到 MySQL 數據庫。 ### 一、準備工作 #### 1. 下載并安裝 MySQL 如果您還沒有安裝 MySQL&#xff0c;可以從 MySQL 官方網站下載并安…

UART編程

Q:為什么使用串口前要先在電腦上安裝CH340驅動&#xff1f; 中斷的作用&#xff1f; 環形buffer的作用&#xff1f; static和valitate的作用 三種編程方式簡介 也可以通過DMA方式減小CPU資源的消耗 直接把數據在SRAM內存和UART模塊進行傳輸 &#xff0c;流程&#xff1a; …

玩家自行定制內存將古老的386 PC內存升級到64MB容量

比爾蓋茨曾說&#xff1a;“無論對誰來說&#xff0c;640K內存都足夠了。” 如果你是一個還停留在 30 針 SIMM 時代的老式電腦愛好者&#xff0c;那么你的內存升級選擇是相當有限的。不過&#xff0c;YouTube 上的一個頻道已經展示了如何將古老的 386 系統內存升級到令人"…

【AI應用探討】—對抗學習(AL)應用場景

目錄 一、圖像領域 二、自然語言處理&#xff08;NLP&#xff09; 三、安全領域 四、其他領域 五、醫療健康領域 六、游戲與娛樂領域 七、機器人與自動化領域 八、科研與教育領域 九、物聯網與邊緣計算 十、金融科技 十一、能源與環境 十二、社會科學與人文研究 十…

Linux內核編譯安裝 - Deepin,Debian系

為什么要自己編譯內核 優點 定制化&#xff1a;你可以根據自己的硬件和需求配置內核&#xff0c;去掉不必要的模塊&#xff0c;優化性能。性能優化&#xff1a;移除不需要的驅動程序和特性&#xff0c;減小內核體積&#xff0c;提高系統性能。最新特性和修復&#xff1a;獲取…

什么是開放最短路徑優先(OSPF)

OSPF是一種典型的鏈路狀態路由協議&#xff0c;一般在同一個路由域中使用。這里的路由域指的是一個自治系統&#xff08;AS&#xff09;&#xff0c;是指一組通過統一的路由策略或協議相互交換路由信息的網絡。在這個自治系統&#xff08;AS&#xff09;中&#xff0c;所有的OS…