nosql項目:基于 Redis 哨兵模式的鮮花預訂配送系統

1 鮮花預訂配送系統概述

1.1 項目背景

鮮花預訂系統是一個實時處理用戶訂單、庫存管理和配送跟蹤的平臺。系統需要處理大量并發訂單,實時更新鮮花庫存狀態,并跟蹤配送進度。傳統關系型數據庫難以應對高并發的訂單處理和實時庫存更新需求,因此采用Redis作為核心數據庫,利用其高性能和豐富的數據結構特性,結合哨兵模式實現高可用性,確保系統穩定運行。

1.2 項目功能

實時訂單處理:快速接收和處理用戶鮮花預訂訂單

庫存管理:實時更新鮮花庫存狀態,防止超賣

配送跟蹤:記錄和更新配送員位置信息

高可用保障:哨兵模式自動故障轉移,避免服務中斷

數據持久化:RDB快照+AOF日志確保訂單和庫存數據可恢復

1.3 技術選型

數據庫:Redis 5.0.7(主從復制 + 哨兵模式)

容器化:Docker部署Redis和哨兵

數據持久化:RDB(定時快照) + AOF(實時日志)

數據結構:使用Hash、Sorted Set、List等多種Redis數據類型

編程語言:Python(用于示例代碼和測試)

2 項目的部署

2.1? 服務器配置

服務器角色

IP地址

操作系統

用途

Redis主節點

10.1.1.11

Centos7

處理讀寫請求,數據持久化

Redis從節點

10.1.1.142

Centos7

復制主節點數據,分擔讀壓力

Redis從節點

10.1.1.148

Centos7

復制主節點數據,分擔讀壓力

哨兵節點

三臺服務器都部署

監控主從狀態,自動故障轉移

2.2 網絡配置:

確保三臺服務器之間網絡互通,可以互相ping通。檢查防火墻設置,確保Redis端口(6379)和哨兵端口(26379)開放。

# 開放Redis端口

sudo firewall-cmd --permanent --add-port=6379/tcp

sudo firewall-cmd --permanent --add-port=26379/tcp

sudo firewall-cmd --reload

# 驗證網絡連通性(主節點ping從節點)

ping 10.1.1.142 -c 3

ping 10.1.1.148 -c 3

?

3.docekr部署redis和哨兵

3.1 在主節點(10.1.1.11)上部署Redis主節點

創建Redis配置文件redis-master.conf

cat > /data/redis/conf/redis-master.conf <<'EOF'

port 6379

bind 0.0.0.0

protected-mode no

daemonize no

dir /data

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

save 900 1

save 300 10

save 60 10000

requirepass 123456

masterauth 123456

maxmemory 2gb

maxmemory-policy allkeys-lru

EOF

啟動redis主節點容器:

docker run -d --name redis-master \

? -p 6379:6379 \

? -v /data/redis/conf:/usr/local/etc/redis \

? -v /data/redis/data:/data \

? redis:5.0.7 \

? redis-server /usr/local/etc/redis/redis-master.conf

3.2 在從節點(10.1.1.142和10.1.1.148)上部署Redis從節點

創建Redis配置文件redis-slave.conf

cat > /data/redis/conf/redis-slave.conf <<'EOF'

port 6379

bind 0.0.0.0

protected-mode no

daemonize no

dir /data

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

save 900 1

save 300 10

save 60 10000

replicaof 10.1.1.11 6379

requirepass 123456

masterauth 123456

maxmemory 2gb

maxmemory-policy allkeys-lru

EOF

在10.1.1.142和10.1.1.148上分別啟動Redis從節點容器:????????????????????????????????????????

docker run -d --name redis-slave \

? -p 6379:6379 \

? -v /data/redis/conf:/usr/local/etc/redis \

? -v /data/redis/data:/data \

? redis:5.0.7 \

? redis-server /usr/local/etc/redis/redis-slave.conf

3.3 在所有節點上部署哨兵

創建哨兵配置文件sentinel.conf

cat > /data/redis/conf/sentinel.conf <<'EOF'

port 26379

bind 0.0.0.0

protected-mode no

daemonize no

logfile "/var/log/redis/sentinel.log"

dir "/tmp"

sentinel monitor mymaster 10.1.1.11 6379 2

sentinel auth-pass mymaster 123456

sentinel down-after-milliseconds mymaster 5000

sentinel failover-timeout mymaster 10000

sentinel parallel-syncs mymaster 1

EOF

在所有三臺服務器上啟動哨兵容器

4. 集群驗證:

4.1 檢查主從復制:

在主節點

docker exec -it redis-master redis-cli -a 123456 info replication

Redis 主從復制已成功部署并正常運行,10.1.1.11是主節點,offset值相同表示主從數據完全同步,lag=1?表示復制延遲極低(理想狀態)

4.2 檢查哨兵的狀態:


docker exec -it redis-sentinel redis-cli -p 26379 info sentinel

哨兵高可用集群已成功部署并正常運行

4.3 故障轉移測試

停止主節點容器docker stop redis-master

觀察哨兵日志docker logs redis-sentinel | grep "failover"

節點驗證:

docker exec -it redis-slave redis-cli -a 123456 info replication

檢查新主節點的數據是否與原主節點一致(如訂單、庫存數據是否完整)

docker exec -it redis-slave redis-cli -a 123456 smembers "orders"

5.功能驗證

連接redis數據庫編寫python腳本(僅顯示核心代碼)

import redis

from redis.sentinel import Sentinel

def test_flower_system():

??? # 連接 Redis Sentinel 并啟用自動解碼

??? sentinel = Sentinel(

??????? sentinels=[('10.1.1.11', 26379), ('10.1.1.142', 26379), ('10.1.1.148', 26379)],

??????? socket_timeout=0.1,

??????? password='123456'

??? )

??? # 主節點連接(讀寫操作)

??? master = sentinel.master_for(

??????? service_name='mymaster',

??????? socket_timeout=0.1,

??????? password='123456',

??????? decode_responses=True

??? )

??? # 從節點連接(只讀操作)

??? slave = sentinel.slave_for(

??????? service_name='mymaster',

??????? socket_timeout=0.1,

??????? password='123456',

??????? decode_responses=True

??? )???

if __name__ == "__main__":

??? test_flower_system()

6.navicat連接redis

進入redis已經可以看到表格了

7.web頁面

Vi app.py (此處只顯示個別核心代碼)

app = Flask(__name__)

# 連接 Redis Sentinel

sentinel = Sentinel(

??? sentinels=[('10.1.1.11', 26379), ('10.1.1.142', 26379), ('10.1.1.148', 26379)],

??? socket_timeout=0.1,

??? password='123456'

)

# 主節點連接(讀寫操作)

master = sentinel.master_for(

??? service_name='mymaster',

??? socket_timeout=0.1,

??? password='123456',

??? decode_responses=True

)

# 從節點連接(只讀操作)

slave = sentinel.slave_for(

??? service_name='mymaster',

??? socket_timeout=0.1,

??? password='123456',

??? decode_responses=True

)

# 初始化數據(如果不存在)

def init_data():

??? if not slave.exists("flower:1"):

??????? master.hset("flower:1", mapping={

??????????? "name": "紅玫瑰",

??????????? "price": 99,

??????????? "stock": 50,

??????????? "description": "鮮艷奪目,象征愛情",

??????????? "image": "https://picsum.photos/id/152/300/300"

??????? })

??????? master.zadd("hot_sales", {

??????????? "flower:1": 100,

??????????? "flower:2": 80,

??????????? "flower:3": 120

??????? })

??????? master.geoadd("delivery_locations", (116.4074, 39.9042, "driver:001"))

??????? master.geoadd("delivery_locations", (116.4174, 39.9142, "driver:002"))

??????? print("數據初始化完成")

if __name__ == '__main__':

??? init_data()

??? app.run(debug=True, host='0.0.0.0', port=5000)

Vi /templates/index.html

退回上一級目錄,運行app.py文件,python app. py

8.數據持久化驗證:

8.1配置說明:

# RDB 快照配置(定時觸發)

save 900 1????? # 900秒內至少1次修改則觸發快照

save 300 10???? # 300秒內至少10次修改

save 60 10000?? # 60秒內至少10000次修改

# AOF 日志配置

appendonly yes?????????????? # 啟用AOF

appendfilename "appendonly.aof"? # AOF文件名

appendfsync everysec???????? # 每秒同步一次(平衡性能與安全)

dir /data?????????????????? # 持久化文件存儲目錄

8.2 RDB快照測試

docker exec -it redis-master redis-cli -a 123456 save

ls /data/redis/data/dump.rdb

8.3 AOF日志測試

docker exec -it redis - master redis - cli - a 123456

# 假設要存儲一個字符串set mykey myvalue

# 假設要存儲一個哈希表hset myhash field1 value1

用ls /data/redis/data/appendonly.aof?查看 AOF 文件是否生成。

如果存在,查看文件內容,能看到記錄的寫操作指令。

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

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

相關文章

中心效應:多中心臨床試驗的關鍵考量

一、中心效應的來源與影響 1.1 常見來源 1.1.1 患者異質性 中心間基線特征差異(如疾病嚴重度、合并癥比例) 1.1.2 操作差異 給藥規范(如輸液速度)、隨訪依從性、數據記錄質量 1.1.3 評估偏倚 影像學判讀標準(如RECIST)、實驗室檢測方法(如中心實驗室 vs 本地實驗室) …

Redis 實現消息隊列

一、為什么選擇 Redis 作為消息隊列&#xff1f; 在分布式系統架構中&#xff0c;消息隊列是實現異步通信和解耦的核心組件。Redis 作為一個高性能的內存數據庫&#xff0c;憑借其卓越的速度和豐富的數據結構&#xff0c;成為輕量級消息隊列的理想選擇&#xff1a; 1.1 核心優…

(3)pytest的setup/teardown

1. 簡介 學過unittest的都知道里面用前置和后置setup和teardown非常好用&#xff0c;在每次用例開始前和結束后都去執行一次。 當然還有更高級一點的setupClass和teardownClass&#xff0c;需配合classmethod裝飾器一起使用&#xff0c;在做selenium自動化的時候&#xff0c;它…

Starrocks存算一體和存算分離

網上整理了一下starrocks兩種部署方式的區別差異性&#xff0c;個人感覺生產環境還是盡量存算分離部署&#xff0c;防止資源爭奪等問題影響線上生產數據&#xff0c;雖然存算一體部署起來更方便一些 &#x1f4ca; 1. 架構設計 存算一體&#xff1a; 節點類型&#xff1a;僅包含…

多線程編程 ----線程主動退出pthread_exit與線程被動退出pthread_cancel

主動退出 pthread_exit 與 pthread_cancel 的區別 1. 核心區別 特性pthread_exitpthread_cancel調用者線程自身調用&#xff0c;主動退出。其他線程調用&#xff0c;異步請求終止目標線程。行為方式立即終止線程&#xff0c;資源需手動釋放。發送取消請求&#xff0c;線程在取…

電腦開機加速工具,優化啟動項管理

軟件介紹 今天為大家推薦一款專業的電腦啟動項管理工具&#xff0c;這款軟件能有效優化電腦開機速度&#xff0c;幫助用戶管理開機自啟動程序。 使用方式 軟件無需安裝&#xff0c;以管理員身份直接雙擊運行即可使用。為確保安全&#xff0c;軟件特別設計為不添加注冊表…

設備管理的11個指標、七大誤區、六大特征

1、設備的完好率 在這些指標里用得最多,但其對管理的促進作用有限。所謂的完好率,是在檢查期間,完好設備與設備總臺數的比例(設備完好率=完好設備數/設備總數)很多工廠的指標可以達到95%以上。理由很簡單,在檢查的那一刻,如果設備是運轉的,沒出故障,就算是完好的,于…

11OAuth2

目錄 本節大綱 一、OAuth2 簡介 二、OAuth2 授權總體流程 三、四種授權模式 授權碼模式 簡化模式 密碼模式 客戶端模式 四、OAuth2 標準接口 五、GitHub 授權登錄 1. 創建 OAuth 應用 2. 項目開發 六、Spring Security OAuth2 七、授權、資源服務器 1. 授權服務器…

Github Copilot協助解決cucumber插件不支持async/await

一、提示詞 問題描述 在使用了badeball/cypress-cucumber-preprocessor插件后&#xff0c;存在不支持nodejs原生的promise和async/await語法問題 執行用例命令 npx cypress run --env configFilemhesi-staging,TAGS"API005" --spec "cypress/integration/AL…

C++多線程【Linux】

Linux的多線程 Linux的子線程實際上也是個進程&#xff0c;但是比傳統的進程輕量化。 pthread pthread是用于Linux系統下的線程庫&#xff0c;頭文件是<pthread.h>。C11 之前的多線程開發高度依賴平臺原生 API&#xff0c;Windows 以 CreateThread 和內核對象為核心&am…

Windows 環境下 NVM 命令詳解:多版本 Node.js 管理利器

“一個 Node.js 版本走天下&#xff1f;太局限了&#xff01;試試 nvm&#xff0c;版本切換如絲般順滑。” 什么是 NVM NVM&#xff08;Node Version Manager&#xff09;是一個命令行工具&#xff0c;允許你安裝并在多個 Node.js 版本之間自由切換。 在 Linux/macOS 下常用的…

一二級路由之間的傳參方式以及高亮問題

實現如下圖所示的一二級路由的高亮情況&#xff1a; 在一級路由APP.vue下設置&#xff1a; .head a.router-link-active {background-color: rgb(235, 221, 204); }在二級路由Mycenter.vue下設置&#xff1a; /* 要求在點擊跳轉到mycenter_lianxi頁面時候父路由保持高亮…

前端JavaScript力扣HOT100刷題【51-100】

注&#xff1a;純手打&#xff0c;如有錯誤歡迎評論區交流&#xff01; 轉載請注明出處&#xff1a;https://blog.csdn.net/testleaf/article/details/148953015 編寫此文是為了更好地學習前端知識&#xff0c;如果損害了有關人的利益&#xff0c;請聯系刪除&#xff01; 本文章…

智能制造數字孿生集成交付生態鏈:智慧產線極速克隆,孿生重構生產周期

在智能制造的浪潮中&#xff0c;數字孿生技術正以前所未有的速度重塑制造業的生產模式。從產品設計到生產制造&#xff0c;再到運維管理&#xff0c;數字孿生通過構建物理世界的虛擬鏡像&#xff0c;實現了生產全流程的數字化映射與優化。 山東融谷信息以“智能制造數字孿生集成…

非常詳細版: dd.device.geolocation 釘釘微應用獲取定位,移動端 PC端都操作,Vue實現釘釘微應用獲取精準定位并渲染在地圖組件上

dd.device.geolocation 釘釘微應用獲取定位,釘釘微應用獲取精準定位并渲染在地圖組件上 ,手機端 PC端要都可用 【dd.device.geolocation是需要鑒權的哦】 想要的數據和效果圖 想要的數據格式 代碼 <template><div class="dialogStyles"

鴻蒙5:組件狀態共享

目錄 1. 組件狀態共享 1.1 狀態共享-父子傳值&#xff1a;Local、Param、Event 1.2 狀態共享-父子雙向綁定!! 1.3 跨代共享&#xff1a;Provider和Consumer 1.3.1 aliasName和屬性名 1.3.2 實現跨代共享 1.3.3 裝飾復雜類型&#xff0c;配合Trace一起使用 1.3.4 支持共…

【MySQL】12. C語言與數據庫的連接

1. 下載MySQL的連接庫 sudo apt install -y libmysqlclient-dev 2. MySQL連接庫的常用接口介紹 通過下面的樣例了解MYSQL的常用接口&#xff1a; #include <iostream> #include <mysql/mysql.h> using namespace std;const char *host "localhost";…

[springboot系列] 探秘JUnit 5: Java單元測試利器

介紹 JUnit 5 是一個用于 Java 編程語言的單元測試框架&#xff0c;它是 JUnit 框架的第五個版本&#xff0c;與 JUnit 4 相比&#xff0c;JUnit 5 提供了許多改進和新特性&#xff0c;包括更好的擴展性、靈活性和對現代 Java 特性的支持。 JUnit 5 由三個主要的子模塊組成&a…

開源 java android app 開發(十三)繪圖定義控件、搖桿控件的制作

文章的目的為了記錄使用java 進行android app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 java an…

Python 庫 包 sentence-transformers

sentence-transformers 是一個非常流行的 Python 庫&#xff0c;專門用于將文本&#xff08;句子、段落、文檔&#xff09;轉換為高質量的語義向量&#xff08;嵌入&#xff09;。它基于 Transformer 架構&#xff08;如 BERT、RoBERTa、DistilBERT 等&#xff09; 的預訓練模型…