gpt4 book ai didi

rust - 如何在 actix-web 路由中缓存或内存数据?

转载 作者:行者123 更新时间:2023-12-03 11:25:15 24 4
gpt4 key购买 nike

我有一个正在实现的 API,其中有一个需要调用的昂贵函数。我想记住这个函数或使用键值缓存来查找以前的结果。我也会考虑 Mutex或类似的结构,但我想避免诸如 Redis 或 Memcached 之类的外部内容。从我读到的,Mutex虽然缓存性能不佳。我如何使用像 HashMap 这样的键值存储或者记住 actix_web 异步路由中的函数?现在,我正在尝试一个简单的 HashMap但我收到此错误:can't borrow data in an Arc as mutable .

async fn index(
kv: web::Data<HashMap<&str, i64>>,
) -> Result<HttpResponse> {
dbg!(kv);
kv.insert("four", 4);
Ok(HttpResponse::Ok().json(kv)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
let tuples: Vec<(&str, i64)> = vec![("one", 1), ("two", 2), ("three", 3)];
let mut m = tuples.into_iter().collect::<HashMap<&str, i64>>();
let mut kv = web::Data::new(m);
// move is necessary to give closure below ownership of counter1
HttpServer::new(move || {
App::new()
.app_data(kv.clone())
.route("/", web::get().to(index))
})
.bind("127.0.0.1:8080")?
.run()
.await
}

最佳答案

似乎您可以使用 cached箱。
将逻辑移至另一个函数。类似于以下代码的工作:

use actix_web::{web, App, HttpServer, HttpResponse};
use cached::proc_macro::cached;

async fn index() -> HttpResponse {
dbg!("in index");
let number = get_number(2);
HttpResponse::Ok().body(number.to_string())
}

#[cached]
fn get_number(n: i32) -> i32 {
dbg!("in get_number");
n * 2
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(move || {
App::new()
.route("/", web::get().to(index))
})
.bind("127.0.0.1:8080")?
.run()
.await
}

关于rust - 如何在 actix-web 路由中缓存或内存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63974092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com