Redis高級應用——2

来源:https://www.cnblogs.com/huangzhenwei97/archive/2018/11/27/10027231.html
-Advertisement-
Play Games

Redis-事務 Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證: 事務的上個步驟: 事務相關指令: 執行事務出現的四種情況: redis事務的三個特性: watch監控 watch監控表示對需要操作的key添加一個樂觀鎖,防止另一個用戶進行修改,導致結果錯誤。 悲觀鎖 顧名思義 ...


Redis-事務

Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:

  1. 事務是一個單獨的隔離操作,事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
  2. 事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行

事務的上個步驟:

  1. 開啟事務:以MULTI開啟一個事務
  2. 命令入隊:將多個命令添加到命令隊列中,接到這些命令不會立即執行,而是放到等待執行的事務隊列中
  3. 執行事務:有EXEC執行事務。(或者DISCARD取消執行)

事務相關指令:

指令 描述
MULTI 標記一個事務塊的開始
EXEC 執行所有事務塊內的命令。
DISCARD 取消事務,放棄執行事務塊內的所有命令。
UNWATCH 取消 WATCH 命令對所有 key 的監視。
WATCH key [key ...] 視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷

 

執行事務出現的四種情況:

  1. 正常執行:隊列中所有的指令全部會被執行。
  2. 全部取消:隊列中的所有指令全部會被取消。
  3. 全體連坐:如果指令集中有一條在加入隊列時報錯,則隊列中的所有指令全部取消。
  4. 冤頭債主:如果指令已經加入到隊列中,但執行失敗,只有當前指令失敗,其它繼續執行。

 

redis事務的三個特性:

  1. 單獨的隔離性:事務中的所有的命令都會序列化,按順序執行,事務在執行過程中,不會被其它客戶端發送過來的命令請求所打斷
  2. 沒有隔離級別的概念:隊列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務里的更新。
  3. 不保證原子性:redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾

watch監控

watch監控表示對需要操作的key添加一個樂觀鎖,防止另一個用戶進行修改,導致結果錯誤。

  • 悲觀鎖
    • 顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會被block直到它拿到鎖。傳統的關係型資料庫裡面就用到了很多這種鎖,比如行鎖,表鎖,讀鎖,寫鎖等,都是在操作之前先上鎖。
  • 樂觀鎖
    • 顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。提交的版本號必須大於當前版本號才可以提交

在訪問以寫入為目的數據的時候(SOL中的SELECT FOR UPDATE),關係資料庫會對被訪同的數據行進行加鎖,直到事務被提交(Commit)
或者被回滾(ROLLBACK)為止,如果有其他客戶端試圖對被加鎖的數據行進行寫入,那麼該客戶端將被阻塞、直到第一個事務執行完畢為止。加鎖在實際使用中非常有效,基本上所有關係資料庫都實現了這種加鎖功能,它的缺點在於,持有鎖的客戶端運行越慢,等待解鎖的客戶端被阻塞的時間就越長。

因為加鎖有可能會造成長時間的等待,所以Redis為了儘可能地減少客戶端的等待時間,並不會在執行WATCH命令時對數據進行加鎖,相反地,Redis只會在數據已經被其他客戶端搶先修改了的情況下,通知執行了WATCH命令的客戶端,

Redis-主從複製

什麼是主從複製?

主從複製,是用來建立一個和主資料庫(master)完全一樣的資料庫環境,稱為從資料庫(slave)。

主從複製的作用和使用場合一般有幾個:

  1. 容災恢復,主資料庫伺服器故障後,可迅速從從資料庫恢復
  2. 讀寫分離、主資料庫主要做寫的操作,從資料庫做讀的操作

主從複製應用場景

  • 電子商務網站上的商品,一般都是一次上傳,無數次瀏覽的,說專業點也就是”多讀少寫”。
  • 對於這種場景,我們可以使如下這種架構

主從複製應用場景說明

 

我們將一臺Redis伺服器作主庫(Matser),其他三台作為從庫(Slave),主庫只負責寫數據,每次有數據更新都將更新的數據同步到它所有的從庫,而從庫只負責讀數據。這樣一來,就有了兩個好處:

    1. 數據被覆製成了了好幾份,就算有一臺機器出現故障,也可以使用其他機器的數據快速恢復。
    2. 讀寫分離,不僅可以提高伺服器的負載能力,並且可以根據讀請求的規模自由增加或者減少從庫的數量,棒極了;

註意事項:

在Redis主從模式中,一臺主庫可以擁有多個從庫,但是一個從庫只能隸屬於一個主庫

主從複製實現方式

  1. 一主二僕
  2. 薪火相傳
  3. 反客為主

一主二僕

一個Master兩個或多個Slave

具體操作:

在多台機器上配置好redis環境,並修改相應的配置文件

只需要在從資料庫加配置如下代碼:

slaveof 主資料庫地址  主資料庫埠

例如:slaveof 127.0.0.1 6379

如果設置了密碼:

masterauth 主庫密碼

示例在一臺機器上面實現一主二僕:

這裡是用的windows版本的redis,然後可以根據Windows Service Documentation.docx文檔建立後臺服務

打開之後找到 redis-server --service-install  和 redis-server --service-uninstall

創建從伺服器

啟動客戶端

​實現主僕關係

當主庫意外關閉時,從庫是什麼情況?

當主庫關閉時,從庫繼續保持從庫狀態,但是和主庫的連接丟失,不能在同步更新數據。如果主庫恢復,從庫也會恢復到連接狀態。 當從庫1關閉時,主庫和從庫N都不受影響。但是當從庫重新恢復時,丟失和主庫的連接狀態,必須重新關聯。

薪火相傳

什麼是薪火相傳?

上一個Slave可以是下一個slave的Master,Slave同樣可以接收其他slaves的連接和同步請求,那麼該slave作為了鏈條中下一個的master,可以有效減輕master的寫壓力

中途變更轉向:會清除之前的數據,重新建立拷貝最新的

實現方式:

slaveof 新主庫IP 新主庫埠​

薪火相傳-演示

1.打開三台伺服器(-主二僕)

2.從客戶端連接三台伺服器,通過指令info replication查詢狀態 

3.將6381的主機修改成6380

語法:slaveof 主機IP  埠

4.再查看效果

反客為主

什麼是反客為主?

使當前資料庫停止與其他資料庫的同步,轉成主資料庫

指令:SLAVEOF no one

演示:

  1. 打開三個伺服器
  2. 打開相應的三個客戶端
  3. 將主伺服器客戶端shutdown
  4. 將第二個客戶端(6380)SLAVEOF no one,反客為主
  5. 將其他的客戶端指向新的master(SLAVEOF 127.0.0.1 6380)

主從複製執行過程:

  1. 當一個從資料庫啟動時,會向主資料庫發送sync命令。
  2. Master接到命令啟動後臺的存檔進程,同時收集所有接收到的用於修改數據集命令,在後臺進程執行完畢之後,master將傳送整個數據文件到slave,以完成一次完全同步。
  3. 全量複製:而slave服務在接收到資料庫文件數據後,將其存檔並載入到記憶體中。
  4. 增量複製:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步。
  5. 但是只要是重新連接master,一次完全同步(全量複製)將被自動執行。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系統版本:CentOS 7.4 top uptime vmstat mpstat sar pidstat ...
  • 一、知識準備 1、在linux中,一切皆為文件,所有不同種類的類型都被抽象成文件(比如:塊設備,socket套接字,pipe隊列) 2、操作這些不同的類型就像操作文件一樣,比如增刪改查等 3、塊設備支持隨機訪問,而字元設備只能依據先後順序來讀取數據。最典型的字元設備就是tty 二、環境準備 | 組件 ...
  • 1.安裝Apache 下載目錄: 安裝程式: 檢查是否安裝成功: 檢查安裝位置: 檢查安裝版本: 檢查安裝成功:在本機瀏覽器輸入伺服器ip,預設根目錄 /var/www 2.安裝Mysql 安裝mysql服務: 安裝mysql客戶端: 查詢mysql狀態: 登錄mysql: 3.安裝php 安裝ph ...
  • oracle中的greatest 函數和 least函數 原文地址:https://blog.csdn.net/sinat_32023305/article/details/78778596 oracle中的greatest 函數和 least函數 oracle中的greatest 函數和 leas ...
  • 作為一個IT成員,特別是偏支持的。很多時候就是和各種異常打交道,總會碰到一些奇奇怪怪的問題。很多時候,可能是一個小小的異常都需要花費很長時間去解決。 SQL Server AlwaysOn 是建立在Windows集群上的,有一次,我登上節點,發現集群和可用性組信息都沒了。雖然,咋一看到,有點怵了。不 ...
  • 1. 分類 常見的游標可分為顯示游標、隱式游標、靜態游標和動態游標四大類: 1.1 顯示游標 顯式是相對與隱式cursor而言的,就是有一個明確的聲明的cursor。顯式游標的聲明類似如下: delcare 游標關鍵字cursor 游標名 is 數據集; 游標從declare、open、fetch、 ...
  • 用戶鎖定表註意事項 通過指定鎖定方法、一個或多個索引、查詢處理操作(如表掃描或索引查找)或其他選項,表提示在數據操作語言 (DML) 語句執行期間覆蓋查詢優化器的預設行為。表提示在 DML 語句的 FROM 子句中指定,僅影響在該子句中引用的表或視圖。 如果查詢計劃不訪問表,則將忽略表提示。 這可能 ...
  • NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關係型的資料庫。隨著互聯網web2.0網站的興起,傳統的關係資料庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以剋服的問題,而非關係型的資料庫則 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...