当前位置: 首页 > news >正文

从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略

前言

最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。

作为一名AI基础设施工程师,我有机会在H20服务器上部署这个庞然大物,并对其进行了全面的压力测试。这篇文章将详细记录我的部署过程和性能测试方法,希望能为大家提供一些参考。

💡 为什么选择DeepSeek R1?

  • 超大规模参数量(671B)
  • 优秀的中英文理解能力
  • 开源可商用的许可证
  • 在多项基准测试中表现优异

那么,如何在自己的服务器上部署这个"巨无霸"模型呢?接下来,我将分享我的完整操作流程。

一、环境准备

1.1 硬件配置

在开始部署之前,先来看看我使用的硬件配置:

  • 服务器型号:H20
  • GPU:8×NVIDIA H20 (141GB)
  • CPU:双路Intel至强处理器
  • 内存:2TB
  • 存储:高速NVMe SSD

这套配置对于部署671B参数的模型来说是刚好够用的。根据我的经验,至少需要8张高端GPU才能满足推理需求。

1.2 环境检查

首先,确认系统资源是否满足需求:

# 检查CPU信息
lscpu# 检查GPU信息
nvidia-smi# 检查内存信息
dmidecode -t memory# 检查磁盘空间
df -h

 这次试用的H20是141G显存的PCIE版本。8张GPU之间都是通过NV18(18条NVLink)互联,形成了全互联(fully connected)的网络拓扑,GPU0-3属于NUMA节点0 (CPU核心0-55,112-167),GPU4-7属于NUMA节点1 (CPU核心56-111,168-223),单卡总带宽:26.562 × 18 ≈ 478 GB/s

 

特别注意:部署DeepSeek R1 671B至少需要700GB的磁盘空间用于存储模型文件,请确保有足够空间。

1.3 软件环境配置

我选择使用Apptainer(原Singularity)作为容器运行环境,它比Docker更适合HPC场景,在多GPU协作方面表现更好。

# 安装Apptainer
sudo add-apt-repository -y ppa:apptainer/ppa
sudo apt update
sudo apt install -y apptainer# 检查安装版本
apptainer --version

二、模型获取与存储

2.1 模型下载

DeepSeek R1 671B模型可以从官方渠道下载,但文件非常大。在我的案例中,模型已预先下载并存储在 /data0/DeepSeek-R1/ 目录下。

2.2 模型完整性验证

下载完成后,务必验证模型文件的完整性:

cd /data0/DeepSeek-R1
# 验证模型文件的MD5值
md5sum model-00001-of-00163.safetensors

⚠️ 注意:模型文件可能分为多个部分,一定要验证所有文件的完整性,避免因文件损坏导致的启动失败。

三、服务部署

对于超大规模模型,我测试了两种主流的部署方式:基于vLLM和基于SGLang的部署。

3.1 基于vLLM的部署

vLLM是一个高性能的大语言模型推理引擎,专为LLM优化,支持PagedAttention等技术,内存使用效率高。

3.1.1 获取vLLM容器镜像
mkdir -p /data0/ctyun/vllm
cd /data0/ctyun/vllm
wget https://jiangsu-10.zos.ctyun.cn/galaxy/apptainer/vllm/vllm-openai_v0.7.3.sif
3.1.2 创建启动脚本
vi run.sh

在脚本中添加以下内容:

#!/bin/bash
apptainer run --nv vllm-openai_v0.7.3.sif \python3 -m vllm.entrypoints.openai.api_server \--model /data0/DeepSeek-R1 \--tensor-parallel-size 8 \--host 0.0.0.0 \--port 8000

这里的关键参数是--tensor-parallel-size 8,表示使用8卡张量并行,这对于671B规模的模型是必须的。

3.1.3 启动服务
sh run.sh

vllm服务启动成功后,每块显卡的显存已经占用了122G。 

成功启动后,vLLM会提供一个兼容OpenAI API格式的接口,默认端口为8000。

3.2 基于SGLang的部署

SGLang是另一个优秀的LLM推理框架,特别在批处理方面有一些独特优势。

3.2.1 下载SGLang容器镜像
mkdir -p /data0/ctyun/sglang
cd /data0/ctyun/sglang
wget https://jiangsu-10.zos.ctyun.cn/galaxy/apptainer/sglang/sglang_v0.4.3-cu125.sif
3.2.2 创建启动脚本并运行
vi run.sh
# 配置SGLang启动参数
#!/bin/bash# SGLang Server Startup Script
# Environment configuration
export OMP_NUM_THREADS=14
export NCCL_IB_DISABLE=1
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"# Model configuration
CONTAINER_PATH="/data0/ctyun/sglang/sglang_v0.4.3-cu125.sif"
WORKSPACE_DIR="/data0/ctyun/sglang/workspace" 
MODELS_DIR="/data0/DeepSeek-R1"
MODEL_NAME="DeepSeek-R1"# Create workspace directory if it doesn't exist
mkdir -p "$WORKSPACE_DIR"# Server Configuration
SGLANG_HOST="0.0.0.0"
SGLANG_PORT=8000# Performance Configuration
TENSOR_PARALLEL_SIZE=8
TOKENIZER_MODE="auto"
LOG_LEVEL="info"echo "Starting SGLang server with model: $MODEL_NAME"
echo "Using GPUs: $CUDA_VISIBLE_DEVICES with TP size: $TENSOR_PARALLEL_SIZE"# Run the SGLang container with Apptainer/Singularity
# Use the LOCAL_PYTORCH_MODEL format to specify a local model
apptainer run --nv \--bind "$WORKSPACE_DIR:/workspace" \--bind "$MODELS_DIR:/model" \"$CONTAINER_PATH" \python3 -m sglang.launch_server \--model-path "/model" \--tokenizer-path "/model" \--host "$SGLANG_HOST" \--port "$SGLANG_PORT" \--tensor-parallel-size "$TENSOR_PARALLEL_SIZE" \--context-length 32768 \--mem-fraction-static 0.9 \--tokenizer-mode "$TOKENIZER_MODE" \--trust-remote-code \--log-level "$LOG_LEVEL"# 启动服务
sh run.sh

🔔 小贴士:我发现vLLM在通用场景下表现更稳定,而SGLang在批处理场景下吞吐量略高。

SGLang明显占用显存一些,模型加载完成显存已经吃得差不多了。 

四、压力测试工具准备

为了全面评估DeepSeek R1 671B的性能,我使用了三种不同的测试工具:LLMPerf、EvalScope和SGLang内置的benchmark工具。

4.1 LLMPerf测试工具安装

LLMPerf是一个专门针对大模型设计的性能测试工具:

mkdir -p /data0/ctyun/yangxian
cd /data0/ctyun/yangxian
git clone https://gitee.com/yangxianpku/llmperf.git# 设置环境变量
export HF_ENDPOINT=https://hf-mirror.com
export OPENAI_API_KEY=secret_abcdefg
export OPENAI_API_BASE="http://localhost:8000/v1/"

4.2 EvalScope测试工具安装

EvalScope是另一个功能强大的评估工具,尤其适合模拟真实用户请求:

# 创建虚拟环境
python3 -m venv evalscope
cd evalscope/
source bin/activate# 安装evalscope
pip install evalscope
pip install evalscope[perf]

4.3 SGLang测试工具安装

SGLang自带了性能基准测试工具,可以精确测量批处理性能:

python3 -m venv sglang
cd sglang/
source bin/activate
pip install "sglang[all]>=0.4.3" --find-links https://flashinfer.ai/whl/cu124/torch2.5/flashinfer-python

五、压力测试方案与结果

接下来是最激动人心的部分 - 压力测试!我设计了一系列测试场景,从单并发到高并发,从短文本到长文本生成,全方位评估模型性能。

5.1 使用LLMPerf进行吞吐量测试

首先,测试不同输入长度下的单并发性能:

# 输入8K tokens,输出1K tokens
python3 token_benchmark_ray.py --model "DeepSeek-R1" \--mean-input-tokens 8192 --stddev-input-tokens 0 \--mean-output-tokens 1024 --stddev-output-tokens 0 \--max-num-completed-requests 6 --timeout 600 \--num-concurrent-requests 1 --results-dir "result_outputs" \--llm-api openai --additional-sampling-params '{}'

然后,测试不同并发数下的性能表现:

# 64并发,输入4K tokens,输出1K tokens
python3 token_benchmark_ray.py --model "DeepSeek-R1" \--mean-input-tokens 4096 --stddev-input-tokens 0 \--mean-output-tokens 1024 --stddev-output-tokens 0 \--max-num-completed-requests 192 --timeout 600 \--num-concurrent-requests 64 --results-dir "result_outputs" \--llm-api openai --additional-sampling-params '{}'

测试结果分析:

  • 单并发下,8K输入+1K输出的场景,平均吞吐量约为750 tokens/s
  • 并发数增加到64时,总吞吐量可达2万 tokens/s左右
  • 超过128并发后,性能提升不明显,甚至可能因资源竞争而下降

5.2 使用EvalScope模拟真实用户请求

EvalScope能模拟更接近真实场景的测试,我从低并发逐步提高到高并发:

# 单并发测试
evalscope perf --parallel 1 --url http://127.0.0.1:8000/v1/chat/completions \--model DeepSeek-R1 --log-every-n-query 5 --connect-timeout 6000 \--read-timeout 6000 --max-tokens 2048 --min-tokens 2048 \--api openai --dataset openqa --number 1 --stream# 逐步提高并发
evalscope perf --parallel 192 --url http://127.0.0.1:8000/v1/chat/completions \--model DeepSeek-R1 --log-every-n-query 5 --connect-timeout 6000 \--read-timeout 6000 --max-tokens 2048 --min-tokens 2048 \--api openai --dataset openqa --number 192 --stream

测试发现:

  1. 对话模式下,流式输出(stream)的用户体验更好
  2. 并发提升到192时,延迟开始明显增加
  3. 输出token长度对吞吐量影响显著:
    • 2048 tokens输出:约10K tokens/s总吞吐量
    • 200 tokens输出:约25K tokens/s总吞吐量
    • 50 tokens输出:约35K tokens/s总吞吐量

5.3 使用SGLang测试批处理性能

SGLang特别适合测试批处理能力:

# 测试不同批处理大小
python3 -m sglang.bench_one_batch_server --model DeepSeek-R1 \--base-url http://127.0.0.1:30000 --batch-size 1 \--input-len 128 --output-len 128python3 -m sglang.bench_one_batch_server --model DeepSeek-R1 \--base-url http://127.0.0.1:30000 --batch-size 192 \--input-len 128 --output-len 128

批处理测试结果:

  • 批处理大小=1:约800 tokens/s
  • 批处理大小=32:约12K tokens/s
  • 批处理大小=192:约28K tokens/s
  • 批处理大小=512:约32K tokens/s(但延迟增加显著)

六、性能监控与调优

在测试过程中,持续监控系统资源使用情况非常重要:

# GPU监控
nvidia-smi# 系统资源监控
htop
nvtop# 进程监控
top

基于监控结果,我发现了一些性能优化的关键点:

  1. GPU利用率:在高并发场景下,GPU利用率稳定在85%-95%之间最佳
  2. CPU资源:预处理和后处理阶段会消耗大量CPU资源,建议使用高频CPU
  3. 内存使用:671B模型在8卡配置下,每卡大约需要64-70GB显存
  4. 网络带宽:高并发场景下网络可能成为瓶颈,建议使用高速网络接口

七、常见问题与解决方案

在部署过程中,我遇到了一些常见问题,分享解决方案:

7.1 资源冲突问题

如果系统中运行着其他Docker容器或进程,可能会与模型部署冲突:

# 停止Docker服务
systemctl stop docker.service
systemctl stop docker.socket# 终止占用资源的Python进程
pkill python3
kill -9 [PID]

7.2 GPU不可见问题

有时容器内无法正确识别GPU:

# 检查NVIDIA驱动与CUDA版本兼容性
nvidia-smi# 确保使用--nv参数启动Apptainer
apptainer run --nv ...

7.3 模型加载缓慢

DeepSeek R1 671B模型非常大,首次加载可能需要3-5分钟,请耐心等待。

7.4 内存溢出错误

如果出现OOM错误,可以尝试:

  • 减小batch size
  • 减小tensor_parallel_size(但可能需要更多显存)
  • 使用模型量化版本(如FP8或INT8)

八、总结与建议

经过一系列测试,我对DeepSeek R1 671B模型有了更深入的了解:

  1. 硬件需求:8张高端GPU(如H20-141G)是基本配置,内存建议1TB以上
  2. 部署方式:vLLM在通用场景更稳定,SGLang在批处理场景优势明显
  3. 并发能力:最佳并发数在128-192之间,超过这个范围性能提升不明显
  4. 响应延迟:首token延迟约1-2秒,生成速度在单请求下750-800 tokens/s
  5. 吞吐量:在最佳配置下,整体吞吐量可达30K tokens/s左右

如果你计划在生产环境部署DeepSeek R1 671B,我的建议是:

  • 使用张量并行(TP)而非流水线并行(PP)
  • 针对真实业务场景进行针对性测试和优化
  • 考虑使用模型量化技术降低资源需求
  • 实现动态批处理以提高整体吞吐量

写在最后

通过这次DeepSeek R1 671B的部署之旅,我深刻体会到大模型服务化的挑战和乐趣。希望本文能帮助更多开发者了解如何部署和测试超大规模语言模型,也欢迎在评论区分享你的经验和问题。

你是否有部署超大模型的经历?遇到了哪些挑战?欢迎在评论区讨论!


关键词: DeepSeek R1, 671B, 大模型部署, vLLM, SGLang, 压力测试, GPU, 张量并行

相关文章:

从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略

前言 最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。 作为一名AI基础…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(5)

1.问题描述: 提供两套标准方案,可根据体验需求选择: 1.地图Picker(地点详情) 用户体验:①展示地图 ②标记地点 ③用户选择已安装地图应用 接入文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guide…...

Leetcode 3469. Find Minimum Cost to Remove Array Elements

Leetcode 3469. Find Minimum Cost to Remove Array Elements 1. 解题思路2. 代码实现 题目链接:3469. Find Minimum Cost to Remove Array Elements 1. 解题思路 这一题我没啥特别好的思路,就只能动态规划了,倒是也能过,不过总…...

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准,方便小学生书法和练字。Word,Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时,如果没有专用模板、奇奇怪怪的插件,使用起来会碰到各种问题。比如,Word里面用…...

(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意:ESP-01sWIFI模块,去搜了一下这个小东西很有玩点,远程控制LED啥的,然后我就想…...

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…...

迷你世界脚本对象库接口:ObjectLib

对象库接口:ObjectLib 迷你世界 更新时间: 2023-04-26 20:21:09 具体函数名及描述如下: 序号 函数名 函数描述 1 getAreaData(...) 获取区域数据 2 getPositionData(...) 获取位置数据 3 getLivingData(...) 获取生物数据 4 getItemDat…...

数据库事务、乐观锁及悲观锁

参考:node支付宝支付及同步、异步通知、主动查询支付宝订单状态 以下容结合上述链接查看 1. 什么是数据库事务? 1.1. 连续执行数据库操作 在支付成功后,我们在自定义的paidSuccess里,依次更新了订单状态和用户信息。也就说这里…...

蓝桥王国--dij模板

#include <bits/stdc.h> // 万能头 using namespace std; typedef pair<long long ,int> PII; int n,m; long long d[300011]; struct edge///邻接表 {int v;long long w; }; int vis[300011]; vector<edge> mp[300011];///邻接表 void dij(int s)///dij单源…...

Java基础关键_017_集合(一)

目 录 一、概述 二、Collection 关系结构 1.概览 2.说明 三、Collection 接口 1.通用方法 &#xff08;1&#xff09;add(E e) &#xff08;2&#xff09;size() &#xff08;3&#xff09;addAll(Collection c) &#xff08;4&#xff09;contains(Object o) &#…...

Rust编程实战:Rust实现简单的Web服务,单线程性能问题

知识点 tcp 服务多线程处理 实现功能 启动web服务&#xff0c;访问链接获取页面内容。 单线程web服务 TcpListener 使用 TcpListener 开启服务端口 let listener TcpListener::bind("127.0.0.1:7878").unwrap();处理客户端连接&#xff1a; for stream in lis…...

GitLab 密钥详解:如何安全地使用 SSH 密钥进行身份验证

目录 一、什么是 GitLab SSH 密钥&#xff1f;二、为什么要使用 SSH 密钥&#xff1f;三、如何生成 SSH 密钥&#xff1f;1. Linux/macOS2. Windows 四、将公钥添加到 GitLab五、配置 SSH 客户端六、常见问题及解决方案七、总结 GitLab 是一个功能强大的 Git 仓库管理平台&…...

《论数据分片技术及其应用》审题技巧 - 系统架构设计师

论数据分片技术及其应用写作框架 一、考点概述 本论题“论数据分片技术及其应用”主要考察的是软件工程中数据分片技术的理解、应用及其实际效果分析。考点涵盖以下几个方面&#xff1a; 首先&#xff0c;考生需对数据分片的基本概念有清晰的认识&#xff0c;理解数据分片是…...

【C++】当一个类A中没有声明任何成员变量和成员函数,sizeof(A)是多少?

在 C 中&#xff0c;即使一个类没有任何数据成员&#xff08;即空类&#xff09;&#xff0c;它的大小也不会是 0&#xff0c;而是 1。这主要有以下几个原因&#xff1a; 地址唯一性要求 C 标准规定&#xff0c;每个对象都必须有唯一的地址。如果空类的大小为 0&#xff0c;那么…...

Maven 私服的搭建与使用(一)

一、引言 在 Java 项目开发中&#xff0c;Maven 作为强大的项目管理和构建工具&#xff0c;极大地提高了开发效率&#xff0c;而 Maven 私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库&#xff0c;架设在局域网内&#xff0c;代理广域网上的远程仓库&…...

Ubuntu20.04双系统安装及软件安装(五):VSCode

Ubuntu20.04双系统安装及软件安装&#xff08;五&#xff09;&#xff1a;VSCode 打开VScode官网&#xff0c;点击中间左侧的deb文件下载&#xff1a; 系统会弹出下载框&#xff0c;确定即可。 在文件夹的**“下载”目录**&#xff0c;可看到下载的安装包&#xff0c;在该目录下…...

linux网络(3)—— socket编程(1)socket基础认识

欢迎来到博主的专栏&#xff1a;linux网络 博主ID&#xff1a;代码小豪 文章目录 IP与端口号socket字节序问题 IP与端口号 我们现在知道了&#xff0c;只要发送的报文的报头包含目的IP地址和源IP地址&#xff0c;就能通过通信设备&#xff0c;是两台主机进行远程通信&#xff…...

【Kubernets】K8S内部nginx访问Service资源原理说明

文章目录 原理概述**一、核心概念****二、Nginx 访问 Service 的流程****1. Service 的作用****2. Endpoint 的作用****3. Nginx Pod 发起请求****(1) DNS 解析****(2) 流量到达 kube-proxy****(3) 后端 Pod 处理请求** **三、不同代理模式的工作原理****1. iptables 模式****2…...

使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南

使用Docker搭建Oracle Database 23ai Free并扩展MAX_STRING_SIZE的完整指南 前言环境准备目录创建启动Docker容器 数据库配置修改进入容器启动SQL*PlusPDB操作与字符串扩展设置配置验证 管理员用户创建注意事项总结 前言 本文将详细讲解在Docker环境中配置Oracle Database 23a…...

使用pytorch和opencv根据颜色相似性提取图像

需求&#xff1a;将下图中的花朵提取出来。 代码&#xff1a; import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...