Rust + PostgreSQL 极简技术栈应用开发

PostgreSQL 插件开发:用 Rust 实现区块链式数据存证 通过本教程,你已经学会了如何在 PostgreSQL 中开发插件,利用 Rust 实现区块链式的数据存证。通过结合 PostgreSQL 强大的数据库能力和 Rust 的高性能特性,你可以构建一个高效、安全、可扩展的区块链式存证系统。这个系统不仅保证了数据的真实性和完整性,还能确保性能的优越性,适合在需要大规模数据存储和存证的场景中应用。添加更多的工作量证明机制。将存证记录与其他区块链技术结合,形成更加完善的存证系统。对存证的查询和验证进行优化,提高系统的效率。 阅读详情

Rust + PostgreSQL 极简技术栈应用开发

在中小规模后端开发场景中,我们常常会不自觉地陷入中间件堆砌的困境,即便业务逻辑并不复杂、并发量也未达到需要多中间件分流的程度,依然会习惯性地引入各类第三方中间件:用Redis 来缓存热点数据、RabbitMQ 来处理异步任务等等。这种堆砌现象,除了部分开发者对架构完善的认知偏差,更多时候还带有明显的面向面试编程成分,很多开发者在学习和实践中,过度侧重面试高频考点,盲目照搬大厂高并发场景下的架构方案,却忽略了中小团队、独立开发者的核心需求:简洁、可靠、易维护、低成本。最终导致项目部署复杂、维护成本飙升,排查问题时需要跨多个中间件定位,反而降低了开发效率和系统稳定性。

本文将实操演示如何用 PostgreSQL 替代缓存、消息队列、搜索、分布式锁等常用中间件,基于 Axum + SQLx + PostgreSQL 技术栈,打造极简且可靠的后端架构,适合中小团队、独立开发者快速落地。

核心思路

摒弃一个场景一个中间件的传统思路,利用 PostgreSQL 的以下特性替代对应中间件:

  • 缓存:利用 PostgreSQL 的 Buffer Cache 机制 + pg_prewarm 扩展预热缓存,配合物化视图实现结果缓存,替代 Redis 轻量级缓存场景。
  • 消息队列:用 PostgreSQL 表模拟队列,结合 SELECT FOR UPDATE SKIP LOCKED 实现并发安全消费,搭配 pg_notify 实现消息通知,替代 RabbitMQ 轻量级队列场景。
  • 搜索:利用 PostgreSQL 内置的全文搜索功能(tsvector + tsquery),配合全文索引,替代 Elasticsearch 等轻量级搜索中间件。
  • 分布式锁:借助 PostgreSQL 的 pg_advisory_lock 函数或表级锁,实现分布式锁,替代 Redis 分布式锁。

这种架构的优势的是所有的操作都围绕 PostgreSQL 展开,无需跨组件同步数据,依托 PostgreSQL 的 ACID 事务保障数据一致性,同时减少中间件部署和维护成本。

环境准备

初始化项目与依赖

使用 Cargo 新建项目:

cargo new rust-postgres-demo
cd rust-postgres-demo

在 Cargo.toml 中添加上依赖:

[dependencies]
axum = { version = "0.8", features = ["json"] }
sqlx = { version = "0.8", features = [
    "runtime-tokio-rustls",
    "postgres",
    "uuid",
    "chrono",
    "json",
    "migrate",
] }
tokio = { version = "1", features = ["full"] }
anyhow = "1.0"
chrono = { version = "0.4", features = ["serde"] }
uuid = { version = "1", features = ["serde", "v4"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenvy = "0.15"

PostgreSQL 扩展安装

在这次项目中我们需要用到以下几个扩展,执行以下 SQL 命令(需超级用户权限):

-- 用于生成 UUID
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 用于缓存预热,将表数据加载到 Buffer Cache
CREATE EXTENSION IF NOT EXISTS pg_prewarm;
-- 用于查看缓存状态
CREATE EXTENSION IF NOT EXISTS pg_buffercache;

初始化代码

在根目录创建 .env 文件并配置数据库连接地址:

DATABASE_URL=postgres://postgres:password@localhost:5432/rust-postgres-demo

编辑 src/main.rs:

use anyhow::Result;
use axum::Router;
use sqlx::PgPool;
use sqlx::postgres::PgPoolOptions;
use std::time::Duration;

#[derive(Clone)]
struct AppState {
    pool: PgPool, // 业务连接池
}

// 初始化全局状态
async fn init_app_state() -> Result<AppState> {
    let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let pool = Arc::new(init_pg_pool(&database_url).await?);

    Ok(AppState { pool })
}

// 初始化 PostgreSQL 连接池
async fn init_pg_pool(database_url: &str) -> Result<PgPool> {
    let pool = PgPoolOptions::new()
        .max_connections(20) // 最大连接数,根据业务并发量调整
        .min_connections(5) // 最小空闲连接,保障业务响应速度
        .acquire_timeout(Duration::from_secs(3)) // 连接获取超时,避免业务阻塞
        .idle_timeout(Duration::from_secs(600)) // 空闲连接超时,释放闲置资源
        .connect(database_url)
        .await?;

    Ok(pool)
}

#[tokio::main]
async fn main() -> Result<()> {
    dotenvy::dotenv().ok();

    let app_state = init_app_state().await?;

    let app = Router::new().with_state(app_state);

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
    axum::serve(listener, app).await?;

    Ok(())
}

模块一:替代缓存

对于传统缓存场景(如热点数据查询、接口结果缓存),可以直接使用 PostgreSQL 的 Buffer Cache 和物化视图即可实现,配合 pg_prewarm 预热缓存。

PostgreSQL 的 Buffer Cache 是服务器共享内存中的核心组件,用于存储关系页,平衡磁盘(毫秒级)和内存(纳秒级)的访问时间,只要数据页被缓存,后续访问无需磁盘操作,性能极高。我们可以通过 pg_prewarm 扩展主动将热点表加载到 Buffer Cache,再用物化视图存储复杂查询的结果,避免重复计算。

新建业务表与物化视图

-- 用户表(核心业务表)
CREATE TABLE IF NOT EXISTS users (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- 物化视图,缓存用户列表结果
CREATE MATERIALIZED VIEW IF NOT EXISTS mv_user_list AS
SELECT id, username, email FROM users ORDER BY created_at DESC;

-- 为物化视图创建索引,提升查询性能
CREATE INDEX IF NOT EXISTS idx_mv_user_list_id ON mv_user_list(id);

PostgreSQL 的物化视图(Materialized View)和普通视图(View)的核心区别在于数据存储与更新机制:普通视图是虚拟的,不存储数据,每次查询动态计算;物化视图实际存储查询结果,像表一样占用磁盘空间,需手动刷新以同步数据。物化视图适合需要快速读取复杂查询结果的场景(用空间换时间),而普通视图保证了实时性。

缓存刷新

缓存预热、定时刷新属于后台任务,你可以使用 crontab 定时触发,也可以手动触发:

// 缓存预热:将物化视图加载到 Buffer Cache
async fn warm_up_cache(pool: &PgPool) -> Result<()> {
    sqlx::query!("SELECT pg_prewarm('mv_user_list'::regclass, 'buffer')")
        .fetch_one(pool)
        .await?;
    Ok(())
}

// 刷新物化视图,手动触发
async fn refresh_user_cache(pool: &PgPool) -> Result<()> {
    sqlx::query!("REFRESH MATERIALIZED VIEW mv_user_list")
        .execute(pool)
        .await?;
    Ok(())
}

Axum 接口调用缓存

接口查询属于核心业务,使用业务连接池,保障接口响应速度:

use axum::{Json, extract::State};
use serde::Serialize;

// 定义用户响应结构体
#[derive(Serialize, sqlx::FromRow)]
struct UserDto {
    id: uuid::Uuid,
    username: String,
    email: String,
}

// 接口:查询用户列表,从缓存中获取
async fn get_user_list(State(state): State<AppState>) -> Result<Json<Vec<UserDto>>, axum::Error> {
    let users = sqlx::query_as!(
        UserDto,
        r#"
    SELECT 
        id as "id!",
        username as "username!", 
        email as "email!" 
    FROM mv_user_list 
    LIMIT 20
    "#
    )
    .fetch_all(&state.pool)
    .await
    .map_err(|e| axum::Error::new(e))?;

    Ok(Json(users))
}

模块二:替代消息队列

轻量级消息队列场景,比如异步通知、任务分发,用 PostgreSQL 表模拟队列,结合 SELECT FOR UPDATE SKIP LOCKED 实现并发安全消费,搭配 pg_notify 实现消息实时通知,

队列表设计

-- 消息队列表
CREATE TABLE IF NOT EXISTS message_queue (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    queue_name VARCHAR(50) NOT NULL, -- 队列名称(支持多队列)
    payload JSONB NOT NULL, -- 消息内容(JSON 格式,适配各类消息)
    status VARCHAR(20) NOT NULL DEFAULT 'pending', -- 消息状态:pending/processing/completed/failed
    retry_count INT NOT NULL DEFAULT 0, -- 重试次数
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- 索引:提升消息查询、消费效率
CREATE INDEX IF NOT EXISTS idx_queue_name_status ON message_queue(queue_name, status);

生产者:发送消息

消息发送属于接口业务,使用业务连接池,保障接口响应速度:

// 消息请求结构体
#[derive(Deserialize)]
struct SendMessageRequest {
    queue_name: String,
    payload: serde_json::Value,
}

// 接口:发送消息,生产者
async fn send_message(
    State(state): State<AppState>,
    Json(req): Json<SendMessageRequest>,
) -> Result<Json<uuid::Uuid>, axum::Error> {
    // 插入消息到队列表
    let message = sqlx::query!(
        r#"
        INSERT INTO message_queue (queue_name, payload)
        VALUES ($1, $2)
        RETURNING id
        "#,
        req.queue_name,
        req.payload
    )
    .fetch_one(&state.pool)
    .await
    .map_err(|e| axum::Error::new(e))?;

    // 发送 pg_notify 通知,告知消费者有新消息
    sqlx::query!(
        "SELECT pg_notify($1, $2)",
        req.queue_name,         // 通知通道(与队列名称一致)
        message.id.to_string()  // 消息 ID(作为 payload)
    )
    .fetch_one(&state.pool)
    .await
    .map_err(|e| axum::Error::new(e))?;

    Ok(Json(message.id))
}

消费者:处理消息

消息消费属于核心业务异步处理,使用业务连接池,确保与业务数据操作的一致性:

use sqlx::postgres::PgListener;

// 消息处理函数(可根据业务自定义)
async fn handle_message(payload: serde_json::Value) -> Result<()> {
    // 模拟消息处理:打印消息内容
    println!("处理消息:{}", serde_json::to_string(&payload)?);
    // 实际业务:发送邮件、异步更新数据等
    Ok(())
}

// 消费者:监听队列,处理消息
async fn message_consumer(state: AppState, queue_name: String) -> Result<()> {
    // 创建 PgListener,监听指定通道
    let mut listener = PgListener::connect_with(&state.pool).await?;
    listener.listen(&queue_name).await?;

    println!("消费者已启动,监听队列:{}", queue_name);

    // 循环监听通知
    loop {
        match listener.recv().await {
            Ok(notification) => {
                // 解析消息 ID,获取消息详情
                let message_id = notification.payload().parse::<uuid::Uuid>()?;
                let mut tx = state.pool.begin().await?;

                // 锁定消息(SKIP LOCKED 避免锁竞争),标记为 processing
                let message = sqlx::query!(
                    r#"
                    SELECT id, payload FROM message_queue
                    WHERE id = $1 AND status = 'pending'
                    FOR UPDATE SKIP LOCKED
                    "#,
                    message_id
                )
                .fetch_optional(&mut *tx)
                .await?;

                if let Some(msg) = message {
                    // 处理消息
                    match handle_message(msg.payload).await {
                        Ok(_) => {
                            // 处理成功,标记为 completed
                            sqlx::query!(
                                "UPDATE message_queue SET status = 'completed', updated_at = NOW() WHERE id = $1",
                                msg.id
                            )
                            .execute(&mut *tx)
                            .await?;
                        }
                        Err(e) => {
                            // 处理失败,重试次数+1,超过3次标记为 failed
                            sqlx::query!(
                                r#"
                                UPDATE message_queue 
                                SET retry_count = retry_count + 1,
                                    status = CASE WHEN retry_count + 1 >= 3 THEN 'failed' ELSE 'pending' END,
                                    updated_at = NOW()
                                WHERE id = $1
                                "#,
                                msg.id
                            )
                            .execute(&mut *tx)
                            .await?;
                            eprintln!("处理消息 {} 失败:{}", msg.id, e);
                        }
                    }
                }

                tx.commit().await?;
            }
            Err(e) => {
                eprintln!("监听队列 {} 失败:{}", queue_name, e);
                // 重试监听
                tokio::time::sleep(Duration::from_secs(3)).await;
                listener.listen(&queue_name).await?;
            }
        }
    }
}

模块三:替代搜索中间件

轻量级搜索场景(如文章搜索、商品搜索),无需部署 Elasticsearch,利用 PostgreSQL 内置的全文搜索功能(tsvector + tsquery),配合全文索引,即可实现高效的关键词搜索、模糊搜索,满足中小规模搜索需求。

搜索表与索引设计

以文章搜索为例,设计文章表,添加全文搜索字段和索引:

-- 文章表(需要搜索的核心表)
CREATE TABLE IF NOT EXISTS articles (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    title VARCHAR(200) NOT NULL, -- 文章标题
    content TEXT NOT NULL, -- 文章内容
    author_id UUID NOT NULL REFERENCES users(id), -- 关联作者
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    -- 全文搜索向量字段(存储 title + content 的分词结果)
    search_vector tsvector GENERATED ALWAYS AS (
        to_tsvector('english', title || ' ' || content)
    ) STORED -- 自动生成并存储,避免每次查询重新计算
);

-- 创建全文索引,提升搜索性能
CREATE INDEX IF NOT EXISTS idx_articles_search ON articles USING GIN(search_vector);

to_tsvector('english', ...) 用于英文分词,中文分词需要安装 pg_jieba 扩展,然后替换为 to_tsvector('jieba', ...)。

Axum 搜索接口实现

use serde::Deserialize;
use chrono::{DateTime, Utc};

// 搜索请求结构体
#[derive(Deserialize)]
struct SearchRequest {
    keyword: String, // 搜索关键词
    page: u32,       // 页码
    page_size: u32,  // 每页条数
}

// 文章搜索响应结构体
#[derive(Serialize, sqlx::FromRow)]
struct ArticleSearchDto {
    id: uuid::Uuid,
    title: String,
    content: String,
    author_id: uuid::Uuid,
    created_at: DateTime<Utc>,
    match_score: Option<f32>, // 匹配度分数
}

// 接口:文章全文搜索(使用业务连接池)
async fn search_articles(
    State(state): State<AppState>,
    Json(req): Json<SearchRequest>,
) -> Result<Json<Vec<ArticleSearchDto>>, axum::Error> {
    let offset = (req.page - 1) * req.page_size;
    // 将搜索关键词转换为 tsquery,支持模糊匹配(:* 表示前缀匹配)
    let query = format!("{}:*", req.keyword);

    let articles = sqlx::query_as!(
        ArticleSearchDto,
        r#"
        SELECT 
            id,
            title,
            content,
            author_id,
            created_at,
            ts_rank(search_vector, to_tsquery('english', $1)) AS match_score
        FROM articles
        WHERE search_vector @@ to_tsquery('english', $1)
        ORDER BY match_score DESC
        LIMIT $2 OFFSET $3
        "#,
        // 参数绑定
        query,
        req.page_size as i64,
        offset as i64
    )
    .fetch_all(&state.pool)
    .await
    .map_err(|e| axum::Error::new(e))?;

    Ok(Json(articles))
}

架构优势与局限

这套架构的好处是降低运维成本:摒弃 Redis、RabbitMQ、Elasticsearch 等中间件,仅需部署 PostgreSQL,减少服务器资源占用和维护成本,尤其适合中小团队和独立开发者。

而且性能足够支撑中小规模场景:PostgreSQL 的 Buffer Cache、全文索引、advisory 锁性能,能满足大部分中小规模业务的缓存、搜索等需求;

但这套架构的局限性也比较明显,以下场景不建议使用:

  • 高并发缓存场景:如秒杀、高频访问的热点数据,Redis 的单线程模型和内存操作性能优于 PostgreSQL。
  • 高吞吐量队列场景:如每秒数万条消息的分发,RabbitMQ、Kafka 的吞吐量和消息投递机制更适合。
  • 大规模复杂搜索场景:如千万级数据量、多维度筛选、分词精度要求极高的场景,Elasticsearch 的分布式搜索能力更有优势。

总结

对于中小规模后端项目、快速迭代的产品,用 PostgreSQL 替代缓存、消息队列、定时器、搜索等中间件,搭配 Axum + SQLx 技术栈,是一种性价比极高的架构选择。

最后提醒,技术选型没有绝对的优劣,适合自己业务场景的才是最好的。如果你的项目是中小规模、对性能要求不极致,不妨试试这种架构,相信能给你带来不一样的开发体验。

使用Rust语言构建PostgreSQL扩展:pgx教程 PostgreSQL作为一款功能强大的开源对象关系数据库系统,其扩展性吸引了大量开发者。本章旨在概述PostgreSQL的扩展开发工作流程,为后文深入探讨Rust语言在PostgreSQL扩展开发中的应用做铺垫。首先,我们将探讨PostgreSQL扩展的基本概念。扩展允许数据库管理员和开发人员为PostgreSQL核心功能集之外增加新的特性。这些扩展可能是自定义函数、数据类型或者索引方法等等,极大地提高了数据库的灵活性和适用场景。 阅读详情

相关推荐

SPSS篇—卡方检验

今天依旧跟大家分享一个在SPSS中使用率比较高的分析方法:卡方检验。 在开始做分析之前,我们需要明白两件事情:卡方检验是什么?一般用来干什么?我们只有充分了解分析方法以后才能够正确的使用它。 卡方检验在百科中的解释是:卡方检验是用途非常广的一种假设检验方法,它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。它的原理是...

小白数据营的博客 20万+

Rust-Sqlx极简教程

简介 sqlx 是 rust 中的一个数据库访问工具。具有以下特点: 异步:原生就支持异步,在并发性高的场合能够得到更好的支持 编译时检查查询:sqlx可以在 cargo build 的时候检查执行sql和响应值 多数据库支持:PostgresSQL,MySql,SqlLite,MSSql,MariaDB 多运行时支持:支持主流 rust 运行时。async-std,tokio,actix,native-tls,rustls 内置连接池,支持查询缓存 不足 sqlx 不是 orm 框架 实践 本例将

Naylor的博客 6553

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例 简介   这是一个回归预测的实例,数据集来自李宏毅的《机器学习》课程的第一次作业,可以用来训练一个线性回归模型或者其他的回归模型,动手实践学习到的理论知识,在实践中去发现问题。这篇文章主要包括数据集的解释、数据的预处理过程及线性回归模型的代码实现这三个部分。由于这个数据集并不能直接使用,还需进行一些重构,为了对初学者更友好一些,我会提供重构完的可以读取后就直接使用的数据集,我也会提供 Matlab\rm MatlabMatlab 可直接使用

qq_27309515的博客 3574

深挖 pgrust:一个比原版还快的 PostgreSQL Rust 重写项目

pgrust 是一个用 Rust 从零重写 PostgreSQL 的开源项目,目标是与 PostgreSQL 18.3 完全兼容,目前已在超过 46,000 条回归查询上与官方输出完全一致。更惊人的是,其新一代实现采用"每连接一线程"模型,事务型负载比 PostgreSQL 快约 50%,分析型负载快约 300 倍。本文将带你快速了解 pgrust 的性能亮点、兼容性现状以及最简单的上手方式。

gitblog_00441的博客 1020

用Python可视化硅晶体生长:3D图解<100>/<110>/<111>晶向差异

本文通过Python 3D可视化技术,详细解析了硅晶体生长中<100>、<110>、<111>三种关键晶向的差异及其在半导体工业中的应用。从密勒指数转换到原子密度计算,结合交互式3D模型展示不同晶向的原子排列特性,帮助读者深入理解晶向对芯片性能的影响。

weixin_42567752的博客 566

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4811

rust web 使用 POSTGRESQL

POSTGRESQL rust web

u010704579的博客 1448

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2285

pgrust 横空出世:Rust 版 PostgreSQL 凭什么挑战 ClickHouse?

pgrust 是一个用 Rust 语言从零重写 PostgreSQL 的开源数据库项目,目标是对齐 PostgreSQL 18.3 的完整兼容性,同时借助 Rust 的内存安全与并发优势把性能推向新高度。项目官方披露,其新一代版本在分析型负载上比 PostgreSQL 快约 300 倍,甚至有望超越以"快"著称的 ClickHouse——这个口号一经发布,立刻引爆了整个数据库圈。🚀 ## pg

gitblog_00958的博客 979

【实战案例】IBM V3500存储控制器故障诊断与更换全流程解析

本文详细解析了IBM Storwize V3500存储控制器发生故障后的完整处理流程。通过还原真实故障现场,介绍了如何利用服务助手精准定位缓存模块损坏的根源,并逐步指导完成控制器备件准备、核心部件移植更换、系统上线同步及全面功能验证的全过程,为存储运维人员提供了一份实用的实战指南。

weixin_29269441的博客 547

iOS远程真机之WebDriverAgent 天坑记

一、WDA安装依赖报错:       这个东西神坑,我搞了一天都没找到解决方案,最后在appium讨论中发现,       解决方案是:       先定位到WebDriverAgent 所在路径$ cd /Users/XXXX/git/WebDriverAgent        然后运行:mkdir -p Resources/WebDriverAgent.bundle sh ./Scripts/b

甫式人生 7316

如何在Rust中快速连接PostgreSQL:Rust-Postgres入门教程

Rust-Postgres是Rust编程语言的原生PostgreSQL驱动,提供了高效、安全的数据库连接解决方案。本教程将帮助你快速上手,在Rust项目中轻松集成PostgreSQL数据库连接功能。 ## 📦 安装与依赖配置 要开始使用Rust-Postgres,首先需要在你的Cargo项目中添加相关依赖。推荐使用`tokio-postgres` crate,它提供了异步支持,是大多数Rus

gitblog_02973的博客 852

Python数据可视化 Pyecharts 制作 Map 地图

大家好,我是Mr数据杨。想象一下,作为一名军师,如诸葛亮或郭嘉,'Map’就如同那战争的沙盘,兵马行动的轨迹,都需要准确的地图作为基础。‘基本设置’,就如同摆设这张战争沙盘,规定棋子的起始位置。‘数据配置选项’和’地图数据项’,就好比是军师们手中的情报,了解各路诸侯的兵力、粮草、地形等重要信息,以便于他们更好地布局。‘Demo’则代表着练兵之地,军师们可以在此基于已有数据,试验各种战术。

Mr数据杨 4万+

pgrust 数据迁移指南:如何平滑迁移到 Rust 版 PostgreSQL

把生产数据库从 C 语言编写的 PostgreSQL 迁移到 Rust 重写版,听起来像是一次"大手术",但 **pgrust 数据迁移** 远比想象中简单。pgrust 是 PostgreSQL 18.3 的 Rust 重写实现,目标是完全兼容 Postgres 的行为,并已通过超过 46,000 条官方回归查询验证。更关键的是,pgrust 与 Postgres **磁盘兼容**,可以直接从现

gitblog_00048的博客 828

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

5 分钟快速上手 pgrust:Rust 版 PostgreSQL 零基础入门指南

pgrust 是一个用 Rust 语言从零重写 PostgreSQL 的开源数据库项目,目标是实现与 PostgreSQL 18.3 的完全兼容。它已经通过了超过 46000 条官方回归测试,并且做到了磁盘级兼容:可以直接启动已有的 PostgreSQL 数据目录。更令人兴奋的是,它在事务型负载上比原生 PostgreSQL 快约 50%,分析型负载最快可达原生版本的 300 倍。这份 Rust

gitblog_00641的博客 1077

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

2026 年最值得关注的开源数据库:pgrust 用 Rust 重写 PostgreSQL

数据库圈正在迎来一场激动人心的变革。**pgrust** 是一个用 **Rust 重写 PostgreSQL** 的开源数据库项目,目标直指 Postgres 18.3 的完整兼容。官方数据显示,其新一代版本在事务负载上比 PostgreSQL 快约 50%,在分析型负载上快约 300 倍,甚至有望在 ClickBench 基准上反超 ClickHouse。无论你是数据库工程师、后端开发者,还是单

gitblog_01083的博客 1140

Docker Rust应用开发指南:从本地开发到容器化部署

在现代应用开发中,容器化技术已经成为不可或缺的一部分。本文将详细介绍如何使用Docker来开发和运行Rust应用程序,特别是与PostgreSQL数据库交互的场景。通过本指南,您将掌握Docker在Rust开发中的核心应用技巧。 ## 准备工作 在开始之前,请确保您已完成以下准备工作: 1. 已安装最新版本的Docker Desktop 2. 熟悉Docker基本概念和操作 3. 已安装gi

gitblog_00415的博客 488

Rust全栈开发实战:PostgreSQL与Rust集成指南

在现代Web应用开发中,数据库是核心组件之一。本文将详细介绍如何在Rust全栈项目中使用PostgreSQL数据库,从基础安装到与Rust生态工具链的集成,为开发者提供一条清晰的技术路径。 ## 技术栈概述 Rust全栈开发通常遵循以下工作流程: 1. 数据库选型与安装(如PostgreSQL) 2. 使用原生SQL命令行工具测试 3. 集成ORM框架(如Diesel) 4. 构建Rust

gitblog_01172的博客 716

pgrust 安装教程:Docker 一键启动你的第一个 Rust 版 PostgreSQL

pgrust 是一个用 Rust 语言从零重写 PostgreSQL 的开源数据库项目,兼容 PostgreSQL 18.3,并通过了超过 46000 条回归测试查询,官方目标是让事务负载提速 50%、分析型负载提速约 300 倍。本文是一份面向新手的 pgrust 安装教程,手把手教你用 Docker 一键启动 Rust 版 PostgreSQL,全程无需编译源码,几分钟即可跑通。 ## pg

gitblog_00699的博客 903

pgrust 源码导读:PostgreSQL C 代码如何 1:1 移植成 Rust

PostgreSQL 是数据库领域的常青树,而 **pgrust** 项目正在做一件疯狂的事:把 PostgreSQL 的 C 代码近乎 1:1 地移植成 Rust。这篇 **pgrust 源码导读** 将带你从零看懂这个项目如何组织代码、如何解决"C 语言全局状态 + 内存管理"与 Rust 所有权模型的冲突,以及为什么它能通过 46,000+ 条回归查询测试。 ## pgrust 是什么?为

gitblog_00881的博客 725

Rust-Postgres:原生 PostgreSQL 驱动与 Rust 的完美结合

**Rust-Postgres** 是一个专为 Rust 编程语言设计的本地 PostgreSQL 数据库驱动。它提供了高性能、安全且低级别的接口,允许开发者直接与 PostgreSQL 进行通信。此项目包括同步和异步客户端,通过 `tokio-postgres` 支持现代异步编程模型。项目遵循 Apache-2.0 或 MIT 许可证,确保了灵活性和广泛的应用场景。 ## 项目快速启动 要快...

gitblog_00532的博客 940

Rusve:基于SvelteKit与Rust的高效Web应用开发框架

Rusve:基于SvelteKit与Rust的高效Web应用开发框架 项目介绍 Rusve是一款开源应用,它巧妙融合了SvelteKit、Rust、PostgreSQL和gRPC,旨在寻找构建既快速又可扩展的Web应用的最佳路径。该项目采用模块化架构,支持多语言环境,特别是强调Go和Rust的协同工作,确保了系统的高效率和稳定性。此外,Rusve侧重于安全性和前端优化,提供丰富的开发工具链,如利用...

gitblog_00141的博客 561

pgrust:用 Rust 重写 PostgreSQL 的革命性数据库项目完整解析

**pgrust** 是一个用 Rust 语言完整重写 PostgreSQL 的开源数据库项目,以 PostgreSQL 18.3 为兼容目标,已通过超过 46,000 条官方回归查询测试,并宣称在事务负载上比原版快 50%、在分析负载上快约 300 倍。本文将从项目背景、核心亮点、真实性能数据、安装体验、源码结构到路线图,为你带来一次关于这个 Rust 重写 PostgreSQL 项目的完整解析

gitblog_00694的博客 202

PL/Rust安装教程:在Debian/Ubuntu系统上快速部署PostgreSQL的Rust扩展

PL/Rust是PostgreSQL的Rust过程语言处理程序,它允许开发者使用Rust语言编写PostgreSQL函数,结合了Rust的安全性和高性能与PostgreSQL的强大数据处理能力。本教程将指导你在Debian/Ubuntu系统上快速部署PL/Rust扩展,让你轻松体验Rust在PostgreSQL中的应用。 ## 环境准备与系统要求 📋 在开始安装PL/Rust之前,需要确保系

gitblog_01106的博客 756

Open-Agent架构全景解析:NestJS + GraphQL + PostgreSQL + Rust + Electron的Monorepo设计深度剖析

Open-Agent 是一个开源的 Agentic AI 平台,可作为 Claude Agent SDK、ChatGPT Agents 和 Manus 的开源替代品。它用 NestJS 搭建服务端、GraphQL 定义接口、PostgreSQL 存储数据、Rust 处理高性能任务、Electron 打包桌面端,全部装进一个 Monorepo 中协同开发。下面带你用最短的篇幅看懂它的架构设计。 [

gitblog_00813的博客 615

GitHub 热榜项目:日榜(2026-11-06)

给编码智能体补工程与产品技能是本期最明显的一类,mattpocock/skills 把需求对齐、TDD、缺陷诊断做成小技能。NVIDIA/auto-ontology 从企业元数据生成本体、构建知识图谱,为 LLM 提供带来源追溯的自然语言查询和 SQL 生成,新增 2,679 星;vercel-labs/agent-desktop 通过桌面无障碍树把界面元素转成 JSON 和可操作 ref,让智能体不必截图就能点击输入,新增 2,173 星。

u130130的博客 449
上一篇: Rust 操作 Redis 从入门到生产级应用
下一篇: 一文读懂 Rust 的 Edition 与 RFC:语言演进的双重保障
Rust研习社
博客等级 码龄11年 51粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值