我有 Axum 处理程序,它返回 Vec
我可能缺乏一些基本的理解,对此感到抱歉,但非常感谢任何帮助。
如何重用缓存中存储的字节?
以下示例代码:
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
}
axum 需要一个自有值(或者更准确地说,一个
'static
值)的原因是,只要 axum 忙于发回回复,它就需要能够保留该值。如果该值的生命周期短于 'static
(就像任何泛型 &[u8]
一样),编译器将无法保证代码的安全性。
您可以简单地将其放入
Vec<u8>
中,然后克隆,而不是克隆整个缓冲区 (Arc<[u8]>
)。 Arc
保证只要至少有一个对它的引用存在,底层数据就会存在,但克隆 Arc
本质上是免费的。