RUST actix-web連接有密碼的Redis數據庫
actix-web的example里面,使用了自己的actix-redis,但是我嘗試了一下,並不好用
替換成另一連接池,deadpool-redis
使用到的庫
庫 | 版本 |
---|---|
deadpool-redis | 0.5.2 |
redis | 0.15.1 |
actix-web | 2 |
actix-rt | 1 |
dotenv | 0.15.0 |
設置環境變量
REDIS_URL=redis://:password@localhost
可以將此鏈接寫入與之形目錄同級的.env
文件中,password替換成自己的密碼,localhost替換成自己的鏈接地址.
dotenv庫加載環境變量
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
dotenv().ok(); //加載.env文件
}
如若不使用!!! dotenv可以手動在代碼中設置環境變量
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
std::env::set_var("REDIS_URL", "redis://:password@localhost");
}
配置鏈接池,並且加載進actix-web
HttpServer::new(|| {
//初始化Redis線程池
let cfg = Config::from_env("REDIS").unwrap();
let pool = cfg.create_pool().unwrap();
App::new()
.data(pool)
.configure(handler::main_config)
})
.bind("127.0.0.1:8088")?
.run()
.await
創建兩個方法,一個讀一個寫,方便我們之后操作redis數據庫
簡化redis操作代碼,如果之后操作庫代碼有變化,我們可以只修改這部分代碼,對整體不會有影響,並且減少寫代碼的重復勞動.
use actix_web::web;
use deadpool_redis::{cmd, Pool};
use serde::{Deserialize,Serialize};
pub async fn get_str(redis: &web::Data<Pool>, name: &str) -> Option<String> {
let mut r = redis.get().await.unwrap();
let v = cmd("GET").arg(&[name]).query_async::<String>(&mut r).await;
match v{
Ok(s)=>{ Some(s)}
Err(_e)=>{None}
}
}
pub async fn set_str(redis: &web::Data<Pool>, name: &str, value: &str) {
let mut r = redis.get().await.unwrap();
cmd("SET").arg(&[name, value]).execute_async(&mut r).await.unwrap();
}
#[derive(Deserialize,Serialize)]
pub struct Success{
code:i32,
msg:String,
}
//制作一個返回,code這個參數雖然推薦使用http code,但是有些前端還是更喜歡從返回值里面取
//,所以就只能照顧一下
pub fn msg_response(code:i32,msg:&str)->Success{
Success{
code:code,
msg:String::from(msg)
}
}
在handler里面調用
async fn test_handler(
redis: web::Data<R_Pool>,
) -> Result<HttpResponse> {
set_str(&redis,"name","value").await;
match get_str(&redis,"name").await{
Ok(result:String)=>{
Ok(HttpResponse::Ok().json(msg_response(200,format!{"{}",result}).as_str()))
}
Erro(e:Erro)=>{
Ok(HttpResponse::Ok().json(msg_response(200,format!{"{}",e}).as_str()))
}
}
}
具體在哪里配置handler這里就不再寫出,詳盡教程地址:actix-web
讓項目更美觀
通常我會把util存到其他地方,handler配置也遠離初次配置app的地方
目錄樹
├─.github
│ └─workflows
├─doc //存放文檔
├─main.rs //入口文件
├─src
│ ├─handler
│ │ ├─mod.rs//統一配置handler的地方
│ │ ├─mobile.rs//分割handler
│ │ └─universal.rs
│ └─util
| ├─db_util.rs //數據庫工具
| ├─redis_util.rs//redis工具
| └─http_util.rs//http工具