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工具

RUST actix-web连接有密码的Redis数据库的更多相关文章

  1. devilbox(三):在docker中启动带密码的redis数据库

    背景概述: 之前是使用docker搭建了一套集成的开发环境devilbox,也说了这个环境可以自定义.其实搭建这个环境一是为了练习docker使用,二是搭建我们测试环境,主要用到各种数据库,然而安装教 ...

  2. C++使用hiredis连接带密码的redis服务

    c = redisConnect((char*)redis_host, redis_port); if (c->err) { /* Error flags, 0 when there is no ...

  3. ServiceStack.Redis 连接有密码的Redis问题解决

    在ip:port前面加上@用来表示密码,比如password@ip:port <add key="RedisServer" value="123456@127.0. ...

  4. 连接带密码的access数据库

    在网上找了很多都不靠谱,稀里哗啦的弄一堆连接字符串,很不优雅. 这个方法很简单: 1.在“连接”这页中,下方有“输入登录数据库的信息”用户名:admin,并在下面选择“空白密码” 2.在“所有”这页的 ...

  5. Rust语言Actix-web框架连接Redis数据库

    Rust语言Actix-web框架连接Redis数据库 actix-web2.0终于发布了,不再是测试版本,基于actor系统再加上异步支持,使得actix-web成为了目前响应速度最快的服务器框架, ...

  6. 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总

    本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...

  7. Web框架之Django-20-基于mysql数据库的连接

    Web框架之Django-20-基于mysql数据库的连接   想要连接mysql首先需要安装pymysql这个驱动     然后在app的init文件中引入驱动 import pymysql pym ...

  8. [经验] SpringBoot 远程连接 Linux 上的 Redis

    开发环境: ---------- springboot 2.X ---------- Linux Ubuntu 18.0.04 关于怎么在 Ubuntu 上安装 Linux , 网上的教程一大堆, 这 ...

  9. scrapy 如何链接有密码的redis scrapy-redis 设置redis 密码 scrapy-redis如何为redis配置密码

    # 使用scrapy_redis的调度器SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 使用scrapy_redis的去重机制DUP ...

随机推荐

  1. 关于Itext 报错-java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable

    如果我们在用iText 做为java 为PDF 文档加水印的时候 报如下异常 java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1Enc ...

  2. IPython的介绍与使用

    1.IPython简介 ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和 ...

  3. Scala实践12

    1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...

  4. 关于Log4Net的使用及配置方式

    目录 0.简介 1.安装程序包 2.配置文件示例 3.日记的级别:Level 4.日志的输出源:Appenders 5.日志格式:Layout 6.日志文件变换方式(回滚方式):RollingStyl ...

  5. 求一个数的阶乘在 m 进制下末尾 0 的个数

    题意 : 求一个数 n 的阶层在 m 进制下末尾 0 的个数 思路分析 : 如果是 10 进制地话我们是很容易知道怎么做的,数一下其对 5 约数地个数即可,但是换成 m 进制的话就需要先将 m 分解质 ...

  6. Iaas/paas/saas 三种模式分别都是做什么?

    任何一个在互联网上提供其服务的公司都可以叫做云计算公司.其实云计算分几层的,分别是Infrastructure(基础设施)-as-a- Service,Platform(平台)-as-a-Servic ...

  7. SpringCloud之Eureka(注册中心集群篇)(三)

    一:集群环境搭建 第一步:我们新建两个注册中心工程一个叫eureka_register_service_master.另外一个叫eureka_register_service_backup eurek ...

  8. hdu6703 线段树+set

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6703 给你一个数组两种操作.操作一是将pos位置的数字加上10000000:操作二是给你个r和k,问你 ...

  9. 轻松理解 Kubernetes 的核心概念

    Kubernetes 迅速成为云环境中软件部署和管理的新标准. 与强大的功能相对应的是陡峭的学习曲线. 本文将提供 Kubernetes 的简化视图,从高处观察其中的重要组件,以及他们的关联. 硬件 ...

  10. 如何查看Ubuntu服务器上Django项目的MySQL服务有没有挂?

    如果你在项目内输入:MySQL -uroot -p 接着输入密码之后返回ERROR:1045……如下图 那么这就说明MySQL服务挂了. 需要重新启动一下 重启时在项目目录下输入:sudo servi ...