Rust言語Activx-webフレームワーク接続Redisデータベース

3398 ワード

Rust言語Activx-webフレームワーク接続Redisデータベース


actix-web 2.0はついに発表され、テストバージョンではなく、actorシステムに基づいて非同期サポートを加えたことで、actix-webは現在最も応答速度の速いサーバーフレームワークとなり、deadpool-redisを使ってこのブログを書く予定だったが、actix-webの官方例を更新すると、actixチームにactix-redisライブラリが新たに追加されたことがわかり、とりあえず新鮮だった.

準備作業


フレーム
説明
バージョン番号
actix-web
rust actorベースの非同期ネットワークライブラリ
2.0
actix-rt
actix運転時
1.0
redis-async
redis非同期接続ライブラリ、TokioフレームワークとRust future構文で作成
0.6.1
actix-redis
redis接続管理ツール
0.8.0
actix
actixコアライブラリ
0.9.0
Cargo.toml
[package]
name = "cloud_test"
version = "0.1.0"
authors = ["yuxq"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
actix = "0.9.0"
actix-web = "2.0"
actix-rt = "1.0"
actix-redis = "0.8.0"
redis-async = "0.6.1"

##接続Redis


必要なパッケージのインポート

#[macro_use]
extern crate redis_async;
//use serde::Deserialize;
use actix::prelude::*;
use actix_redis::{Command, RedisActor, Error};
use actix_web::{middleware, web, App, Error as AWError, HttpResponse, HttpServer, Responder};
use redis_async::resp::RespValue;

接続の準備

        let redis_addr = RedisActor::start("localhost:6379");

actix-webにバインド

    HttpServer::new(|| {
        let redis_addr = RedisActor::start("localhost:6379");
        App::new().data(redis_addr)
            .route("/set", web::get().to(set))
            .route("/get", web::get().to(get))
//            .route("/again", web::get().to(index2))
    })
        .bind("127.0.0.1:8088")?
        .run()
        .await

2つのテストインタフェースを用意し、1つはredis値を設定し、1つはRedis値を取得する。

async fn set(redis: web::Data>) -> Result {
//    let result:Result = redis.send(Command(resp_array!["SET","myname","myvalue"])).await?;
    let result=redis.send(Command(resp_array!["set","name","myvalue"])).await?;


    match result {
        Ok(RespValue::SimpleString(s)) if s == "OK" => {
            Ok(HttpResponse::Ok().body("Set values success!"))
        }
        _ => {
            println!("---->{:?}", result);
            Ok(HttpResponse::InternalServerError().finish())
        }
    }
}

async fn get(redis:web::Data>)-> Result {
    let result=redis.send(Command(resp_array!["get","name"])).await?;
    match result{
        Ok(RespValue::BulkString(s)) =>{
            Ok(HttpResponse::Ok().body(s))
        }
        _ => {
            println!("---->{:?}", result);
            Ok(HttpResponse::InternalServerError().finish())
        }
    }

}

アクセスlocalhost:8088/set
その後localhost:8088/getにアクセス
rustは強いタイプなので、戻り値タイプに注意し、設定時に戻るタイプはSimpleString、取得時に戻るのはBulkString、失敗したlogに注目すると戻りタイプが表示されます.