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; 的预训练模型…