Linux中Docker redis介紹以及應用

一、NoSQL

1.1 單機mysql的美好時代

在90年代,一個網站的訪問量一般都不大,用單個數據庫完全可以輕松應付。

那個時候,更多的是靜態網頁,動態交互類型的網站不多。

上述架構上,我們來看看數據存儲的瓶頸是什么?

DAL:Data Access Layer(數據庫訪問層)

  • 數據量的總大小一個機器放不下時

  • 數據的索引(B+ Tree)一個機器的內存放不下時

  • 訪問量(讀寫混合)一個實例不能承受

如果滿足了上面的1 or 3 個時,只能對數據庫的整體架構進行重構

1.2 mysql主從讀寫分離

讀寫集中在一個數據庫上讓數據庫不堪重負,大部分網站開始使用主從復制技術來達到讀寫分離,以提高讀寫性能和讀庫的可擴展性。

Mysql的master-slave模式成為這個時候的網站標配了。

1.3 MySQL的擴展性瓶頸

MySQL數據庫也經常存儲一些大文本字段,導致數據庫表非常的大,在做數據庫恢復的時候就導致非常的慢,不容易快速恢復數據庫。

比如1000萬4KB大小的文本就接近40GB的大小,如果能把這些數據從MySQL省去,MySQL將變得非常的小。

關系數據庫很強大,但是它并不能很好的應付所有的應用場景。

MySQL的擴展性差(需要復雜的技術來實現),大數據下IO壓力大,表結構更改困難,正是當前使用MySQL的人員面臨的問題。

1.4 今天是什么樣子

最前面的是企業級防火墻,后面通過負載均衡主機在 web 服務器集群之間進行調度,再由具體的 web 服務器(Tomcat)去訪問緩存,訪問數據庫。

1.5 為什么用nosql

今天我們可以通過第三方平臺(如:Google,Facebook等)可以很容易的訪問和抓取數據。

用戶的個人信息,社交網絡,地理位置,用戶生成的數據和用戶操作日志已經成倍的增加。

我們如果要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。

1.6 什么是nosql

NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”。

泛指非關系型的數據庫。隨著互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高并發的的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由于其本身的特點得到了非常迅速的發展。

NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題,包括超大規模數據的存儲。

(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。

這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。

1.7 nosql代表

MongoDB、Redis 和 Memcached 都是非常流行的數據庫/緩存解決方案,但它們的設計目標和使用場景有所不同。

以下是這三個軟件的簡要分析及其主要區別的表格:

  • MongoDB:雖然MongoDB主要是作為一個NoSQL數據庫被廣泛認知,它提供了一個靈活的文檔存儲模型(JSON-like documents),適用于處理各種類型的數據。盡管MongoDB可以作為緩存層使用,但這并不是它的主要用途。MongoDB更適合于需要復雜查詢和數據持久化的應用場景。

  • Redis:Redis是一個開源的內存數據結構存儲系統,通常用作數據庫、緩存和消息中間件。它支持多種數據結構如字符串、哈希、列表、集合等,并且提供了豐富的操作命令。由于所有數據都存儲在內存中,Redis讀寫速度非常快,適合用于實時數據分析、計數器、排行榜等高性能要求的場景。

  • Memcached:Memcached是一種高性能的分布式內存對象緩存系統,主要用于加速動態Web應用程序的數據訪問速度。與Redis相比,Memcached更簡單,只支持基本的鍵值對存儲,并且不支持持久化存儲。它非常適合用來緩存簡單的對象,如HTML片段或數據庫查詢結果。

特性MongoDBRedisMemcached
類型文檔型NoSQL數據庫內存數據結構存儲(鍵值對)分布式內存緩存
主要用途數據庫數據庫、緩存、消息中間件緩存
數據結構JSON-like文檔字符串、哈希、列表、集合等多種數據結構鍵值對
持久化支持可選(默認情況下為內存存儲)不支持
擴展性水平擴展(分片)主從復制、哨兵、集群模式分布式架構
性能中等(磁盤I/O影響性能)高(全內存操作)高(全內存操作)
適用場景復雜查詢、大數據集實時分析、高速交易、隊列加速頁面加載、緩存數據庫查詢結果

1.8 關系數據庫和nosql的區別

RDBMS

  • 高度組織化的結構化數據

  • 結構化查詢語言(SQL)

  • 數據和關系都存儲在單獨的表中

  • 數據操作語言,數據定義語言

  • 嚴格的一致性

  • 基礎事務

  • ACID原則(事務的特性)

    • A (Atomicity) 原子性:原子性很容易理解,也就是說事務里的所有操作要么全部做完,要么都不做,事務成功的條件是事務里的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。比如銀行轉賬,從A賬戶轉100元至B賬戶,分為兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。

    • C (Consistency) 一致性:一致性也比較容易理解,也就是說數據庫要一直處于一致的狀態,事務的運行不會改變數據庫原本的一致性約束。

    • I (Isolation) 獨立性:所謂的獨立性是指并發的事務之間不會互相影響,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。比如現有有個交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的

    • D (Durability) 持久性:持久性是指一旦事務提交后,它所做的修改將會永久的保存在數據庫上,即使出現宕機也不會丟失。

nosql

  • 沒有聲明性查詢語言

  • 沒有預定義的模式

  • 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫

  • 最終一致性,而非ACID屬性

  • 非結構化和不可預知的數據

  • 高性能,高可用性和可伸縮性

  • CAP定理(說明:C:強一致性 A:高可用性 P:分布式容忍性)

    • Consistency(一致性), 數據一致更新,所有數據變動都是同步的

    • Availability(可用性), 好的響應性能

    • Partition tolerance(分區容錯性) 可靠性

定理:任何分布式系統只可同時滿足二點,沒法三者兼顧。

1.9 小結

  • 在性能方面,NoSQL數據庫使用一些算法將對磁盤的隨機寫轉換成順序寫,提升了寫的性能

  • 在擴展性方面,NoSQL數據庫天生支持分布式,支持數據冗余和數據分片的特性

  • 在某些場景下,比如全文搜索功能,關系型數據庫并不能高效的支持,需要NoSQL數據庫的支持

二、軟件實踐

Redis 是一個開源的內存數據結構存儲系統,通常用作數據庫、緩存和消息中間件。

它支持多種數據類型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Sorted Set)。

拉取 Redis 鏡像

在終端或中運行以下命令來拉取最新的 Redis 官方鏡像:

docker pull redis

運行 Redis 容器

使用命令啟動一個 Redis 容器:

docker run --name my-redis -d redis

連接到 Redis 容器

可以使用 Docker 命令進入 Redis 容器內部,然后使用 Redis CLI 來與 Redis 實例進行交互:

docker exec -it my-redis redis-cli

字符串(String)

字符串是最基礎的數據類型,也是 Redis 的默認數據類型。

SET:設置鍵值對。

SET key value

示例:

set name jack

GET:獲取鍵對應的值。

GET key

示例:

get name 

哈希(Hash)

哈希是用于存儲字段和字段值的映射表,適合存儲對象。

HSET:設置哈希表中的字段值。

HSET hash field value

示例:

hset person name lshhset person age 18

HGET:獲取哈希表中指定字段的值。

HGET hash field

示例:

HGET person name

列表(List)

列表是一個簡單的字符串列表,按照插入順序排序。可以從列表的兩端進行添加或移除元素。

LPUSH:在列表的左側插入一個或多個值。

LPUSH list value [value ...]

示例:

LPUSH mylist "a" "b"

LRANGE:獲取列表中指定范圍的元素。

LRANGE mylist 0 -1注釋:
-1    指的是最后一位

集合(Set)

集合是一個無序不重復元素的集合。

SADD:向集合中添加一個或多個成員。

SADD set member [member ...]

示例:

sadd names qwe asd zxc

SMEMBERS:返回集合中的所有成員。

smembers names

SPOP:隨機從集合中抽一個值

spop names

有序集合(Sorted Set)

有序集合類似于集合,但每個成員都關聯了一個分數,這使得成員可以根據分數來排序。

ZADD:向有序集合中添加一個或多個成員,或者更新已存在成員的分數。

ZADD zset score member [[score member] [score member] ...]

示例:

zadd socres 60 wxqzadd socres 70 jyx

ZRANGE:返回有序集中指定區間內的成員,按分數值遞增排序。

ZRANGE zset start stop [WITHSCORES]

示例:

zrange socres 0 -1

三、主從復制與哨兵模式

Redis的主從復制和哨兵模式是兩種不同的機制,旨在提高系統的可用性和數據冗余度。它們各自有不同的目標和實現方式。

主從復制(Replication)

主從復制是指Redis支持單個master節點對應多個slave節點的一種架構模式。在這種模式下:

  • 數據同步:Master節點可以進行讀寫操作,而Slave節點只能進行讀操作。Master會自動將數據更新同步給所有連接的Slave節點。

  • 高可用性:通過增加Slave節點數量來提升讀取性能,并提供一定的數據冗余。如果Master節點發生故障,雖然可以通過手動切換到某個Slave節點作為新的Master節點繼續服務,但這個過程需要人工干預,不能自動完成故障轉移。

  • 配置簡單:只需要在配置文件中指定slaveof參數即可讓一個Redis實例成為另一個實例的Slave。

哨兵模式(Sentinel)

哨兵模式是在主從復制的基礎上增加了自動故障檢測和自動故障轉移的功能,確保系統具有更高的可用性:

  • 監控:哨兵系統可以監控多個Master-Slave集群,持續檢查Master和Slave實例的健康狀態。

  • 通知:當發現Master節點不可用時,哨兵系統能夠自動執行故障轉移策略,即將其中一個Slave提升為新的Master,并更新其他Slave的配置指向新的Master。

  • 自動化故障轉移:無需人工干預即可完成故障恢復,減少了停機時間。

  • 配置管理:哨兵系統還負責客戶端請求的重定向,確保客戶端能夠正確地連接到當前的Master節點。

特性主從復制哨兵模式
數據同步Master向Slave同步數據在Master失效后,由Sentinel選擇一個Slave晉升為Master并同步數據
故障處理需要手動干預進行故障轉移自動檢測故障并自動進行故障轉移
監控能力不具備監控和自動恢復功能提供了對Redis實例的監控及自動恢復服務
高可用性提供了一定程度的數據冗余,但不保證服務不間斷通過自動故障轉移提高了系統的高可用性
使用場景適合于讀寫分離、數據備份等需求適用于需要高度自動化運維、減少人為干預的場景

創建自定義網絡
docker network create redis-net
啟動 Redis Master
docker run -d \--name redis-master \--network redis-net \-p 6379:6379 \redis
啟動 Redis Slave
docker run -d \--name redis-slave1 \--network redis-net \redis \redis-server --slaveof redis-master 6379docker run -d \--name redis-slave2 \--network redis-net \redis \redis-server --slaveof redis-master 6379
查看是否主從復制連接成功
docker logs redis-slave1

查看當前的主從狀態

可以通過以下命令進入任意一個 Redis 實例來查看其角色(Master 或 Slave)。

檢查 Redis Master 狀態
-- 進入redis-master客戶端
docker exec -it redis-master redis-cliINFO replication

會看到類似于以下內容,表明它是某個 Master 的 Slave:

配置并啟動 Sentinel(哨兵)

配置 sentinel.conf 文件,內容如下:

port 26379
dir /tmp
sentinel monitor mymaster redis-master 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1注釋:
sentinel     哨兵
monitor      監控器
mymaster     集群名(可以隨便寫)
redis-master 主服務器名字
6379         端口號
1            投票數量(只要投票有1票通過就可以勝任新的主服務器)
down-after-milliseconds     下線時間(主服務器如果5s沒有響應,就將其下線)
配置項含義示例值
portSentinel 監聽的端口26379
dirSentinel 工作目錄/tmp
sentinel monitor監控的主節點信息mymaster redis-master 6379 1
sentinel down-after-milliseconds多久沒響應視為下線5000 ms
sentinel failover-timeout故障轉移最大等待時間10000 ms
sentinel parallel-syncs同步新 Master 的 Slave 并發數1

然后運行 Sentinel 容器:

docker run -d \--name redis-sentinel \--network redis-net \-p 26379:26379 \-v $(pwd)/sentinel.conf:/usr/local/etc/redis/sentinel.conf \redis \redis-sentinel /usr/local/etc/redis/sentinel.conf

檢查哨兵是否運行成功:

查看哨兵日志

docker logs redis-sentinel

查看主服務器ip

docker inspect redis-master

修改哨兵配置文件

vim sentinel.conf

然后重新啟動哨兵

docker restart redis-sentinel

如果怕ip會變,可將ip固定

docker run -d \--name redis-master \--network redis-net \--ip 【查詢詳情里的ip寫入即可】-p 6379:6379 \redis注意:其他服務器也可以固定

手動觸發故障轉移

現在讓我們模擬 Master 故障的情況。停止 Redis Master 容器:

docker stop redis-master

查看哨兵日志

docker logs redis-sentinel

第一句話意思是:檢測到主服務器掛了

第二句話意思是:已經選擇為172.18.0.4的從服務器為新的主服務器

等待幾秒鐘后,檢查 Sentinel 是否已經將其中一個 Slave 提升為新的 Master。可以通過連接到 Sentinel 來查詢當前的 Master:

docker exec -it redis-sentinel redis-cli -p 26379SENTINEL get-master-addr-by-name mymaster

如果一切正常,應該得到新 Master 的 IP 地址和端口。

驗證故障轉移后的狀態

再次使用 INFO replication 命令分別檢查原 Slave(現在應該是新的 Master)和其他 Slave 的狀態,確保它們都正確地進行了角色轉換。

對于新的 Master:

docker exec -it redis-slave1 redis-cliINFO replication

會發現它的角色變為 role:master

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

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

相關文章

鍋氣:「現炒之魂·煙火人間」

《現炒之魂煙火人間》高清4K寫實攝影方案高清4K寫實攝影方案描述,可直接作為AI繪畫工具(如MidJourney/DALLE)的提示詞使用:🌟 核心概念? 主題:中式爆炒瞬間的生命力爆發? 氛圍:熾烈煙火氣 神…

【力扣494】目標和

用子集法,選or不選變成了正or負,BFS執行所有情況,判斷恰好為目標和。 靈神: 設所有數的和為s,取正的和為p,則和為p-(s-p); 有t p-(s-p) 2p-s,即p (st)/2;這里的s和t都…

零基礎AI編程開發微信小程序賺流量主廣告實戰

目錄 前言:為什么選微信小程序流量主?零基礎也能搞定的開發流程AI編程助手怎么幫忙?實戰案例:做個AI圖片識別小程序流量主廣告怎么接入和變現?常見問題與避坑指南經驗總結與互動1. 前言:為什么選微信小程序…

第六十三章:AI模型的“跨界之旅”:不同硬件架構下的兼容性方案

不同硬件架構兼容前言:AI的“英雄”與“舞臺”第一章:AI硬件生態總覽:百花齊放的“算力戰場”1.1 CPU:AI計算的“全能基石”1.2 GPU:AI計算的“核心加速器”1.3 專用AI芯片:NPU/TPU等“定制利器”第二章&am…

2 Abp 框架核心架構

ABP Framework 核心架構 架構概述 ABP Framework 基于模塊化、分層架構構建,遵循領域驅動設計(DDD)、依賴注入和 SOLID 原則,為構建可維護、可測試和可擴展的應用程序提供基礎。 核心模塊 #mermaid-svg-10g1JRKDltZN4z5P {font-fa…

Spring的高頻基礎面試題(二)

1. 線程池創建的作用是什么 ? 線程池的核心參數有哪些 ? 線程池執行任務的流程 ?作用:提高線程的復用性,降低損耗資源。核心參數:核心線程 、最大線程數 、等待空閑時間、時間單位、任務隊列、線程工廠、拒絕策略執行流程: 首…

【JavaEE】(12) 創建一個 Sring Boot 項目

一、Maven 1、什么是 Maven Maven 用于管理項目、管理依賴(通過 POM 文件配置各種各樣的 jar 包)。 在沒有 Maven 之前,需要手動將 jar 包導入項目。整個流程:從網上查 jar 包并下載到本地(或者叫同事發)&…

最終章【1】Epson機器人篇

1,開發環境 Epson RC 7.5.1 RC90控制器 2,條件分支指令 2.1,If...EndIf,邏輯判斷分支 語法格式: If 條件1 Then 處理邏輯1................ ElseIf 條件2 Then 處理邏輯2................ Else 處理邏輯3................ EndIf 例子: String order$If ord…

vue3 實現web網頁不同分辨率適配

vue3 實現web網頁不同分辨率適配首先這個標題可能不是特別的合適,之前開發了一個網站,那個網站是類似于官網的效果,按照 19201080100% 的分辨率進行開發的,但是在開發完成之后,發現有的電腦是 19201080125% 的大小展示…

電子電路原理學習筆記---第5章特殊用途二極管---第2天

5.5閱讀數據手冊圖5-15給出了1N957B和1N4728A系列的齊納二極管數據手冊中的數據,再后面的討論中將參考這些數據。數據手冊中大部分信息是提供給電路設計者的,但有些內容在故障診斷和測試時也有必要了解。5.5.1最大功率齊納二極管的功率等于它對應的電壓與…

實現一個二維碼讓 iOS 和 Android 用戶自動跳轉到對應下載鏈接

實現一個二維碼讓 iOS 和 Android 用戶自動跳轉到對應下載鏈接 背景 開發一個APP后,需要分發Android測試包和iOS TestFlight的場景,但為兩個端分別生成二維碼,需要為二維碼標識系統以免導致用戶掃錯碼。如何實現一個二維碼讓 iOS 和 Androi…

Docker中ES安裝分詞器

1、下載好的文件上傳到虛擬機或者云服務器 https://release.infinilabs.com/analysis-ik/stable/ elasticsearch-analysis-ik-8.10.4.zip 2、將本地 ZIP 文件復制到容器內的臨時目錄(如 /tmp/) docker cp /data/elasticsearch-analysis-ik-8.10.4.zip e…

掌握while循環:C語言編程基礎

目錄 一、while循環簡介 二、if和while的對比 語法結構對比: 實際代碼對比: 三、while語句的執行流程 while循環的執行流程如下: 流程圖表示: 四、while循環實踐 練習:在屏幕上打印1~10的值 五、進階練習 題…

XML Schemas 簡介

XML Schemas 簡介 引言 XML(可擴展標記語言)是互聯網上用于數據交換的一種標準標記語言。隨著互聯網技術的飛速發展,XML因其靈活性和可擴展性而被廣泛應用于各種領域。XML Schemas(XML模式)作為一種定義XML文檔結構的機制,為XML文檔提供了嚴格的規范,確保了數據的準確…

Gradle(二)Gradle的優勢、項目結構介紹

目錄一、什么是 Gradle?二、為什么選擇 Gradle?三、Gradle 的項目結構3.1 項目結構3.2 gradle wrapper 包裝器3.3 settings.gradle 設置文件3.4 build.gradle 核心構建文件1)原始文件內容2)plugins 插件3)repositories…

機器學習-決策樹(上)

決策樹構建: 決策樹的結構與python中的二叉樹結構(PY數據結構-樹)相似,不過決策樹中除了葉節點之外的其他節點,都被稱之為“決策節點”,構建決策樹的過程,也就是選取每一個節點采用哪一個特征作為劃分依據的過程。 以…

一周學會Matplotlib3 Python 數據可視化-繪制直方圖(Histogram)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程: 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置&…

uni-app之刪除沒用的文件,搭建頁面

文章目錄一、初始化項目1.1 初始化index.vue1.2 刪除無用文件1.3 初始化后的目錄結果如下二、文件目錄分析2.1 核心文件2.2 關鍵文件夾?2.3 其他文件2.4 注意事項??三、創建頁面(pages)3.1 創建home頁面3.2 創建其他頁面3.3 查看pages.json3.4 刪除index頁面和pages.json的配…

99、【OS】【Nuttx】【構建】cmake 配置實操:問題解決

【聲明】本博客所有內容均為個人業余時間創作,所述技術案例均來自公開開源項目(如Github,Apache基金會),不涉及任何企業機密或未公開技術,如有侵權請聯系刪除 背景 接之前 blog 【OS】【Nuttx】【構建】cm…

2007-2023年各省環境保護支出統計數據

數據介紹 環境保護支出是指政府和企業為改善生態環境質量、防治污染、保護自然資源所投入的資金,涵蓋污染防治、生態修復、環境管理等多方面。污染防治支出、生態保護支出、環境管理事務、資源節約與循環利用等,當前環保支出仍面臨區域不平衡、隱性債務…