RUST actix-web连接有密码的Redis数据库
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数据库的更多相关文章
- devilbox(三):在docker中启动带密码的redis数据库
背景概述: 之前是使用docker搭建了一套集成的开发环境devilbox,也说了这个环境可以自定义.其实搭建这个环境一是为了练习docker使用,二是搭建我们测试环境,主要用到各种数据库,然而安装教 ...
- C++使用hiredis连接带密码的redis服务
c = redisConnect((char*)redis_host, redis_port); if (c->err) { /* Error flags, 0 when there is no ...
- ServiceStack.Redis 连接有密码的Redis问题解决
在ip:port前面加上@用来表示密码,比如password@ip:port <add key="RedisServer" value="123456@127.0. ...
- 连接带密码的access数据库
在网上找了很多都不靠谱,稀里哗啦的弄一堆连接字符串,很不优雅. 这个方法很简单: 1.在“连接”这页中,下方有“输入登录数据库的信息”用户名:admin,并在下面选择“空白密码” 2.在“所有”这页的 ...
- Rust语言Actix-web框架连接Redis数据库
Rust语言Actix-web框架连接Redis数据库 actix-web2.0终于发布了,不再是测试版本,基于actor系统再加上异步支持,使得actix-web成为了目前响应速度最快的服务器框架, ...
- 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总
本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...
- Web框架之Django-20-基于mysql数据库的连接
Web框架之Django-20-基于mysql数据库的连接 想要连接mysql首先需要安装pymysql这个驱动 然后在app的init文件中引入驱动 import pymysql pym ...
- [经验] SpringBoot 远程连接 Linux 上的 Redis
开发环境: ---------- springboot 2.X ---------- Linux Ubuntu 18.0.04 关于怎么在 Ubuntu 上安装 Linux , 网上的教程一大堆, 这 ...
- scrapy 如何链接有密码的redis scrapy-redis 设置redis 密码 scrapy-redis如何为redis配置密码
# 使用scrapy_redis的调度器SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 使用scrapy_redis的去重机制DUP ...
随机推荐
- Vue+Vant+Vuex实现本地购物车功能
通常,我们做移动端商城的时候,通常会有购物车模块,那购物车模块有两种实现方式,一是储存在后台通过接口获取到购物车信息,二是存在用户手机本地,第一种方法只要调用接口获取比较简单,这里介绍的是第二种方法, ...
- (一)Django项目架构介绍
项目的架构为: 1.虚拟环境virtualenv 安装Django==2.1.3 安装pymysql 安装mysqlclient 安装其他等 2.项目结构为: 应用APP: blog -- 管理博客 ...
- NetCore 启动地址配置详解
背景 程序在发布部署时候,设置环境ASPNETCORE_URLS不生效,也没在代码里使用UseUrls("xxxx"),启动一直是http://localhost:5000.最后测 ...
- Keil uVision4的简单使用
1. 项目创建 打开安装好的Keil uVision4可以看到如下界面 选择New uVision Project来创建一个新项目 选择项目存放的位置并为项目文件命名 选择要进行模拟仿真的设备(此处以 ...
- HashMap 源码赏析 JDK8
一.简介 HashMap源码看过无数遍了,但是总是忘,好记性不如烂笔头. 本文HashMap源码基于JDK8. 文章将全面介绍HashMap的源码及HashMap存在的诸多问题. 开局一张图,先来看看 ...
- No property andp found for type String! Traversed path: CmsPage.siteId.
Respository没有找到该参数 1)由该参数,函数名写错,不符合JPA规范 2)实体类没有该参数
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前 ...
- C++ 链式继承下的虚函数列表
目录 1.虚函数列表的位置 2.虚函数列表的内容 3.链式继承中虚函数列表的内容 注: 虚函数列表 又称为虚表, vtbl , 指向它的指针称为vptr, vs2019中称为__vfptr 操作系 ...
- python3复习
一.基础11.运行python代码cmd->python 文件路径/文件名称2.解释器针对linux/uinux系统3.注释单行注释 #多行注释 三个单引号或三个双引号4.变量法律规 ...
- selenium之窗口滚动
在这里和大家分享一下,selenium里面常用于处理窗口滚动的方法. location_once_scrolled_into_view 一般用于定位窗口底部元素.将窗口拉到最底部. window.sc ...