Rust Axum,处理程序 fn 中返回的二进制类型

问题描述 投票:0回答:1

我有 Axum 处理程序,它返回 Vec,二进制数据。结果通常是相同的,因此我使用仪表板缓存它。 问题是 dashmap get 给了我参考,因此要从 Axum 处理程序返回它,我需要始终先克隆它以获得拥有的版本bytes.clone()。可以不每次都这样做吗?既然我只读取这些数据,为什么 Axum 需要它的拥有版本?它是否以某种方式移动到网络套接字或类似的东西中?还有不安全的生锈可以解决吗?或者也许我需要通过实现我自己的 IntoResponse 来解决这个问题。

我可能缺乏一些基本的理解,对此感到抱歉,但非常感谢任何帮助。

如何重用缓存中存储的字节?

以下示例代码:

use axum::{ extract::State, routing::get, Router };
use std::sync::Arc;
use dashmap::DashMap;

struct AppState {
    cache: DashMap<String, Vec<u8>>
}

#[tokio::main]
async fn main() {
    let cache: DashMap<String, Vec<u8>> = DashMap::new();
    let shared_state = Arc::new(AppState { cache });

    let app = Router::new()
        .route("/", get(handler))
        .with_state(shared_state);

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3001").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

async fn handler(
    State(state): State<Arc<AppState>>,
) -> Vec<u8> {
    let cached = state.cache.get("test");
    if cached.is_some() {
        let bytes = cached.unwrap();
        println!("Cloned from cache!");
        return bytes.clone();
    }

    let data: Vec<u8> = vec![0x00,0x01,0x02,0x03,0x04,0x05,0x06];
    state.cache.insert("test".to_string(), data.clone());
    data
}
rust rust-axum
1个回答
0
投票

axum 需要一个自有值(或者更准确地说,一个

'static
值)的原因是,只要 axum 忙于发回回复,它就需要能够保留该值。如果该值的生命周期短于
'static
(就像任何泛型
&[u8]
一样),编译器将无法保证代码的安全性。

您可以简单地将其放入

Vec<u8>
中,然后克隆,而不是克隆整个缓冲区 (
Arc<[u8]>
)。
Arc
保证只要至少有一个对它的引用存在,底层数据就会存在,但克隆
Arc
本质上是免费的。

© www.soinside.com 2019 - 2024. All rights reserved.