Redis系列:Redis持久化機制與Redis事務

Redis 是個基于內存的數據庫。那服務一旦宕機,內存中數據必將全部丟失。所以丟失數據的恢復對于 Redis 是十分重要的,我們首先想到是可以從數據庫中恢復,但是在由 Redis 宕機時(說明相關工作正在運行)且數據量很大情況下,從數據庫恢復的話,會為數據庫帶來巨大的壓力,進而導致程序相應緩慢。因此實現數據的持久化,避免從后端數據庫中恢復數據,對于Redis 是十分必要的。

本篇內容包括:Redis 持久化機制(即 RDB、AOF 和 二者的區別)、Redis 事務及相關命令。


文章目錄

    • 一、Redis 持久化機制
        • 1、Redis 持久化機制 RDB
        • 2、Redis 持久化機制 AOF
        • 3、Redis 持久化機制 RDB 與 AOF 的區別
    • 二、Redis 事務
        • 1、Redis 事務
        • 2、Redis 事務相關命令
        • 3、關于 Pipeline


一、Redis 持久化機制

Redis 是個基于內存的數據庫。那服務一旦宕機,內存中數據必將全部丟失。所以丟失數據的恢復對于 Redis 是十分重要的,我們首先想到是可以從數據庫中恢復,但是在由 Redis 宕機時(說明相關工作正在運行)且數據量很大情況下,從數據庫恢復的話,會為數據庫帶來巨大的壓力,進而導致程序相應緩慢。因此實現數據的持久化,避免從后端數據庫中恢復數據,對于Redis 是十分必要的。

此外,Redis 可以通過創建快照來獲得存儲在內存里面的數據。創建快照之后,可以對快照進行備份,可以將快照復制到其他服務器從而創建具有相同數據的服務器副本(Redis 主從結構,主要用來提高 Redis 性能),還可以將快照留在原地以便重啟服務器的時候使用,其中 Redis 最常用的快照持久化機制分為兩種,即 RDB 與 AOF。

1、Redis 持久化機制 RDB

RDB 持久化可以手動執行也可以根據配置定期執行,它的作用是將某個時間點上的數據庫狀態保存到 RDB 文件中,RDB 文件是一個壓縮的二進制文件,通過它可以還原某個時刻數據庫的狀態。由于RDB文件是保存在硬盤上的,所以即使 Redis 崩潰或者退出,只要 RDB 文件存在,就可以用它來恢復還原數據庫的狀態。

可以通過 SAVE 或者 BGSAVE 來生成 RDB 文件:

  • SAVE 命令會阻塞 Redis 進程,直到 RDB 文件生成完畢,在進程阻塞期間,redis 不能處理任何命令請求,這顯然是不合適的。
  • BGSAV E則是會 for k出一個子進程,然后由子進程去負責生成 RDB 文件,父進程還可以繼續處理命令請求,不會阻塞進程。

2、Redis 持久化機制 AOF

AOF 和 RDB 不同,AOF 是通過保存 redis服務器所執行的寫命令來記錄數據庫狀態的。

AOF機制

AOF 通過追加、寫入、同步三個步驟來實現持久化機制。

  1. 當 AOF 持久化處于激活狀態,服務器執行完寫命令之后,寫命令將會被追加 append 到 aof_buf 緩沖區的末尾
  2. 在服務器每結束一個事件循環之前,將會調用 flushAppendOnlyFile 函數決定是否要將 aof_buf 的內容保存到AOF文件中,可以通過配置 appendfsync 來決定。
    • always:aof_buf 內容寫入并同步到 AOF 文件
    • everysec:將 aof_buf 中內容寫入到 AOF 文件,如果上次同步 AOF 文件時間距離現在超過1秒,則再次對 AOF 文件進行同步
    • no:將 aof_buf 內容寫入AOF文件,但是并不對 AOF 文件進行同步,同步時間由操作系統決定
  3. 如果不設置,默認選項將會是 everysec,因為 always 來說雖然最安全(只會丟失一次事件循環的寫命令),但是性能較差,而 everysec 模式只不過會可能丟失1秒鐘的數據,而 no 模式的效率和 everysec 相仿,但是會丟失上次同步 AOF 文件之后的所有寫命令數據。

3、Redis 持久化機制 RDB 與 AOF 的區別

  • 實現方式:RDB 持久化是通過將某個時間點 Redis 服務器存儲的數據保存到 RDB 文件中來實現持久化的;AOF持久化是通過將 Redis 服務器執行的所有寫命令保存到 AOF 文件中來實現持久化的;
  • 文件體積:由上述實現方式可知,RDB 持久化記錄的是結果,AOF 持久化記錄的是過程,所以 AOF 持久化生成的 AOF 文件會有體積越來越大的問題,Redis 提供了 AOF 重寫功能來減小 AOF 文件體積;
  • 安全性:AOF 持久化的安全性要比 RDB 持久化的安全性高,即如果發生機器故障,AOF 持久化要比 RDB 持久化丟失的數據要少。因為 RDB 持久化會丟失上次 RDB 持久化后寫入的數據,而 AOF 持久化最多丟失1s之內寫入的數據(使用默認everysec 配置的話);
  • 優先級:由于上述的安全性問題,如果 Redis 服務器開啟了 AOF 持久化功能,Redis 服務器在啟動時會使用 AOF 文件來還原數據,如果 Redis 服務器沒有開啟 AOF 持久化功能,Redis 服務器在啟動時會使用 RDB 文件來還原數據,所以 AOF 文件的優先級比 RDB 文件的優先級高。
-RDBAOF
啟動優先級
文件大小
恢復速度
數據安全性丟數據根據策略決定

二、Redis 事務

1、Redis 事務

Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務機制,事務執行過程將一系列多個命令按照順序一次性執行,并且在執行期間,事務不會被中斷,也不會去執行客戶端的其他請求,直到所有命令執行完畢。事務的執行過程如下:

  1. 服務端收到客戶端請求,事務以 MULTI 開始
  2. 如果客戶端正處于事務狀態,則會把事務放入隊列同時返回給客戶端 QUEUED,反之則直接執行這個命令
  3. 當收到客戶端 EXEC 命令時,WATCH 命令監視整個事務中的 key 是否有被修改,如果有則返回空回復到客戶端表示失敗,否則 Redis 會遍歷整個事務隊列,執行隊列中保存的所有命令,最后返回結果給客戶端

WATCH 的機制本身是一個 CAS 的機制,被監視的 key 會被保存到一個鏈表中,如果某個 key 被修改,那么 REDIS_DIRTY_CAS 標志將會被打開,這時服務器會拒絕執行事務。

2、Redis 事務相關命令

Redis 通過 MULTI、EXEC、DISCARD、WATCH 實現事務功能:

# MULTI 開始事務

> multi
OK

MULTI 命令將 Redis 中的 Redis_multi 選項打開,讓客戶端從非事務狀態變為事務狀態

圖片

# 命令入隊

> set bookName "LiZhengi"
QUEUED
> get bookName
QUEUED
> sadd tag "LiZhengi" "Old Book"
QUEUED
> smembers tag
QUEUED

在 Redsi 進入事務狀態后,Redis 命令并不是立即執行的,而是進入一個先進先出的事務隊列。其中返回 QUEUED 表示這個命令已經入了事務隊列。

# exec 提交事物

> exec
1) OK
2) "LiZhengi"
3) (integer) 2
4) 1) "LiZhengi"2) "Old Book"

可以看到:當執行 exec 命令時,Redis 根據客戶端所保存的事務隊列,事務隊列中的命令以先進先出的方式執行。當 exec 命令執行完畢時,Redis 會將結果保存到一個回復隊列,并將回復隊列返回給客戶端。客戶端從事務狀態退出,一個事務執行完畢。

# discard 取消事務

> multi
OK
> set bookName "LiZhengi"
QUEUED
> discard
OK
> get bookName
(nil)

discard 取消一個事務的命令,表示這個事務被取消。客戶端從事務狀態退出,回到非事務狀態,Redis_multi 選項關閉。

# watch 命令

watch 命令在事務開始之前監視任意數量的鍵:當調用 exce 命令執行事務時,如果任意一個被監視的鍵已經被其他客戶端修改了,那么整個事務不再執行,直接返回失敗。

3、關于 Pipeline

管道技術(Pipeline)是客戶端提供的一種批處理技術,用于一次處理多個 Redis 命令,從而提高整個交互的性能。

通常情況下 Redis 是單行執行的,客戶端先向服務器發送請求,服務端接收并處理請求后再把結果返回給客戶端,這種處理模式在非頻繁請求時不會有任何問題。

但如果出現集中大批量的請求時,因為每個請求都要經歷先請求再響應的過程,這就會造成網絡資源浪費,此時就需要管道技術來把所有的命令整合一次發給服務端,再一次響應給客戶端,這樣就能大大的提升了 Redis 的響應速度。

管道技術解決了多個命令集中請求時造成網絡資源浪費的問題,加快了 Redis 的響應速度,讓 Redis 擁有更高的運行速度。但要注意的一點是,管道技術本質上是客戶端提供的功能,而非 Redis 服務器端的功能。

Pipeline 與 事務相比:

  • pipeline 是客戶端的行為,對于服務器來說是透明的,可以認為服務器無法區分客戶端發送來的查詢命令是以普通命令的形式還是以 pipeline 的形式發送到服務器的;
  • 而事務則是實現在服務器端的行為,用戶執行 MULTI 命令時,服務器會將對應這個用戶的客戶端對象設置為一個特殊的狀態,在這個狀態下后續用戶執行的查詢命令不會被真的執行,而是被服務器緩存起來,直到用戶執行 EXEC 命令為止,服務器會將這個用戶對應的客戶端對象中緩存的命令按照提交的順序依次執行。

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

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

相關文章

Java基礎:Java程序設計環境

按應用范圍,Java 可分為 3 個體系,即 Java SE、Java EE 和 Java ME。Java 語言的開發運行,也離不開 Java 語言的運行環境 JRE。沒有 JRE 的支持,Java 語言便無法運行。當然,如果還想編譯 Java 程序,搞搞小開…

負載均衡策略

輪循均衡(Round Robin):每一次來自網絡的請求輪流分配給內部中的服務器,從1至N然后重新開始。此種均衡算法適合于服務器組中的所有服務器都有相同的軟硬件配置并且平均服務請求相對均衡的情況。 我們的業務web服務器都是同樣配置…

Java基礎:Java數據類型

Java 是一種強類型語言,這就意味著必須為每一個變量聲明一種類型。在 Java 中基本數據類型共有 8 種,包括 4 種整型、2 種浮點型、1 種用于表現 Unicode 編碼的字符單元的字符類型 char 和一種用于表示真值的 boolean 類型 ~ 本篇主要記錄內容包括&#…

TCP連接的建立與終止

TCP連接的建立與終止 1.三次握手 TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。在TCP/IP協議中,TCP協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方…

日常問題:MySQL排序字段數據相同不能分頁問題

【問題日期】 2022-11-14 22:45:12 【問題描述】 MySQL 排序字段數據相同不能分頁問題:在分頁查詢數據時,按創建時間排序,由于數據是批量創建的,導致部分數據創建時間一樣,而此時分頁查詢數據,翻頁后出現…

數據缺失值處理

數據缺失值處理 In [1]: import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer In [2]: df pd.DataFrame() df[…

Java基礎:Java數字類型

Java 中包含多種運算符:算數運算符、關系運算符、邏輯運算符、位運算符。在 Math 類中,包含了各種各樣的數學函數。在編寫不同類別的程序時,可能需要的函數也不同。要生成一個隨機數,可以使用 Random 對象。 ~ 本篇主要…

Java基礎:Java流程控制

塊(即復合語句)是指由一對大括號括起來的若干條簡單的 Java 語句。塊確定了變量的作用域。一個塊可以嵌套在另一個塊中。但是,不能在嵌套的兩個塊中聲明同名的變量。使用塊(有時稱為復合語句)可以在Java程序結構中原本…

Java基礎:Java類與對象

面向對象程序設計(簡稱OOP)是當今主流的程序設計范型,它已經取代了20世紀70年代的“結構化”過程化程序設計開發技術。Java是完全面向對象的,必須熟悉OOP才能夠編寫Java程序。面向對象的程序是由對象組成的,每個對象包…

SVN備份腳本

#!/bin/bash #svn全量備份腳本 wwytcode_path/home/wwytcode/project backup_path/home/bak Datedate %Y%m%d cd $backup_path echo date >> $back_path/svn_backup.log svnversionsvnlook youngest $wwytcode_path svnadmin dump --revision 0:$svnversion $wwytcode_pa…

Java基礎:Java面向對象

面向過程的優點是性能比面向對象高,不需要面向對象的實例化;缺點是不容易維護、復用和擴展。面向對象的優點是具有封裝、繼承、多態的特性,因而容易維護、復用和擴展,可以設計出低耦合的系統;缺點是由于需要實例化對象…

薪資生成

import openpyxl from openpyxl.styles import Font,Alignment,Side,Border#設置字體樣式 fontFont(name宋體,size20,boldTrue) font2Font(name宋體,size12,boldTrue) alignmentAlignment(horizontalcenter,verticalcenter,wrap_textTrue) sideSide(stylethin ,color000000) …

Java基礎:Java抽象接口

在Java中,一個沒有方法體的方法應該定義為抽象方法,而如果一個類中含有抽象方法,則該類必須定義為一個抽象類。接口是功能的集合,同樣可看做是一種特殊的數據類型,是比抽象類更為抽象的類,接口只描述所應該…

13 張圖帶你學懂 Kubernetes Service(轉載)

在 Kubernetes 中 Service 主要有4種不同的類型,其中的 ClusterIP 是最基礎的,如下圖所示: 當我們創建一個 NodePort 的 Service 時,它也會創建一個 ClusterIP,而如果你創建一個 LoadBalancer,它就會創建一…

Java基礎:Java異常機制

異常是程序運行過程中出現的錯誤。Java 把異常當作對象來處理,把異常信息封裝成了一個類,并定義一個基類java.lang.Throwable作為所有異常的超類。Throwable : 它是所有錯誤與異常的超類(祖宗類),有兩個子類 Error 和 Exception。…

JavaWeb:Servlet的應用及接口介紹

廣義的 Servlet 泛指在服務器上運行的 Java 程序,但是這個 Java 程序,并不能獨立運行(因為 Servlet 沒有 main 方法),需要部署在相應的 Servlet 容器中,比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地…

DOCKERFILE參數注解

Dockerfile由一行行命令語句組成,并且支持以#開頭的注釋行。 一般的,Dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為…

Zookeeper:分布式過程協同技術

Zookeeper 是一個高性能的分布式一致系統,在分布式系統中有著廣泛的應用。基于它,可以實現諸如“分布式同步”、“配置管理”、“命名空間管理”等眾多功能,是分布式系統中常見的基礎系統。Zookeeper 主要用來解決分布式集群中應用系統的一致…

面試題2021-2-24

給某CentOs6慮擬機添加了新的數據盤,設備名為/de/sdd.寫命令格式化滿加的效的并掛載到指定目錄/opt fdisk -l mkfs.ext4 /de/sdd mount /de/sdd /opt 如何查看與RabbtMQ服務器之間的establish狀態連接數?netstat -an |grep ESTABLISHED |grep tcp |wc -l…

Zookeeper:在三種模式下的部署

zookeeper 安裝模式有三種:單機模式:單機單 server;集群模式:多機多 server,形成集群;偽集群模式:單機多 server,形成偽集群。 ~ 本篇內容包括:Zookeeper 官網下載、Zook…