首页 > 数据库 >actix_web操作redis

actix_web操作redis

时间:2024-10-25 17:12:30浏览次数:1  
标签:web actix MyError string redis r2d2 key new pool

toml

actix-web = "4"
redis = { version = "0.21.4", features = ["r2d2"] }
r2d2 = "0.8.9"
r2d2_redis = "0.14.0"
uuid = { version = "0.8", features = ["v4"] }

with_r2d2.rs

use redis::Commands;
use std::time::Duration;

pub type R2D2Pool = r2d2::Pool<redis::Client>;
type R2d2PooledCon = r2d2::PooledConnection<redis::Client>;

const PREFIX: &str = "with_r2d2";
const TTL: usize = 60 * 5;
const MAX_POOL_SIZE: u32 = 30;
const CONNECTION_TIMEOUT: Duration = Duration::from_secs(10);

/// 默认创建
pub fn _simple_create_pool(host_addr: &str) -> Result<R2D2Pool, MyError> {
    let client = redis::Client::open(host_addr).map_err(|e| MyError::new_string(e.to_string()))?;

    r2d2::Pool::builder()
        .build(client)
        .map_err(|e| MyError::new_string(e.to_string()))
}

pub fn create_pool(host_addr: &str) -> Result<R2D2Pool, MyError> {
    let client = redis::Client::open(host_addr).map_err(|e| MyError::new_string(e.to_string()))?;
    r2d2::Pool::builder()
        .max_size(MAX_POOL_SIZE)
        .connection_timeout(CONNECTION_TIMEOUT)
        .build(client)
        .map_err(|e| MyError::new_string(e.to_string()))
}

fn get_key(base: &str) -> String {
    format!("{}:{}", PREFIX, base)
}

fn create_connection(pool: &R2D2Pool) -> Result<R2d2PooledCon, MyError> {
    pool.get().map_err(|e| MyError::new_string(e.to_string()))
}

pub fn set(pool: &R2D2Pool, key: &str, value: &str) -> Result<(), MyError> {
    let mut con = create_connection(pool)?;
    let redis_key = get_key(key);
    con.set_ex(redis_key, value, TTL)
        .map_err(|e| MyError::new_string(e.to_string()))
}

pub fn get(pool: &R2D2Pool, key: &str) -> Result<String, MyError> {
    let mut con = create_connection(pool)?;
    let redis_key = get_key(key);
    con.get(redis_key)
        .map_err(|e| MyError::new_string(e.to_string()))
}

#[derive(Debug)]
pub struct MyError {
    pub msg: String,
}
impl MyError {
    pub fn new_str(s: &str) -> MyError {
        MyError { msg: s.to_string() }
    }
    pub fn new_string(s: String) -> MyError {
        MyError { msg: s }
    }
}

main.rs

use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};
use uuid::Uuid;
mod with_r2d2;

#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}
#[get("/r2d2")]
async fn set_with_r2d2(pool: web::Data<with_r2d2::R2D2Pool>) -> impl Responder {
    let id = Uuid::new_v4();
    let key = format!("{}", id);
    let value = "hi";
    let result = with_r2d2::set(&pool, &key, value);
    match result {
        Ok(_) => HttpResponse::Ok().body(key),
        Err(e) => HttpResponse::InternalServerError().body(e.msg),
    }
}
#[get("/r2d2/{id}")]
async fn get_with_r2d2(
    pool: web::Data<with_r2d2::R2D2Pool>,
    info: web::Path<(String,)>,
) -> impl Responder {
    let result = with_r2d2::get(&pool, &info.0);
    match result {
        Ok(r) => HttpResponse::Ok().body(r),
        Err(e) => HttpResponse::NotFound().body(e.msg),
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let host = "redis://192.168.252.128/";
    let r2d2_pool = with_r2d2::create_pool(host).unwrap();
    HttpServer::new(move || {
        App::new()
            .app_data(web::Data::new(r2d2_pool.clone()))
            .service(hello)
            .service(set_with_r2d2)
            .service(get_with_r2d2)
    })
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

标签:web,actix,MyError,string,redis,r2d2,key,new,pool
From: https://www.cnblogs.com/qcy-blog/p/18502929

相关文章

  • Redis运维常用命令(持续更新)
    查看连接clientlist身份认证authpassword获取慢查询##结果为查询ID、发生时间、运行时长和原命令默认10毫秒,默认只保留最后的128条。单线程的模型下,一个请求占掉10毫秒是件大事情,注意设置和显示的单位为微秒,注意这个时间是不包含网络延迟的。SLOWLOGGET10##获取慢......
  • 场景题:百万数据插入Redis有哪些实现方案?
    在面试的过程当中,偶尔会遇到一些场景题,虽然这些场景题归根到底还是技术问题,但他通常比常规的八股题要稍微难一些,因为他考验的是你对于技术的整体理解、应用,以及变通的能力。那么今天咱们就来看一道,在面试中国平安时遇到的一道场景题:将百万数据插入到Redis,有哪些实现方案?1.Redis......
  • 如何将GB28181/GB35114流媒体监控视频汇聚平台LiveGBS中自带的redis组件换成自己的Red
    @目录1、Redis服务2、如何切换REDIS?2.1、停止启动REDIS2.2、配置信令服务2.3、配置流媒体服务2.4、启动3、搭建GB28181视频直播平台1、Redis服务在LivGBS中Redis作为数据交换、数据订阅、数据发布的高速缓存服务。默认LiveCMS解压目录下会携带一个REDIS服务。如果已经有自己的r......
  • redis迁移 redis-dump和redisshake
    redis-dump从a服务器redis1号库迁移到b服务器redis的1号库(网络不互通)ruby版本有要求,我服务器报错2.7.8以上1.安装需要的依赖yuminstallrubyrubygemsruby-devel-y2.配置秘钥curl-sSLhttps://rvm.io/mpapis.asc|gpg2--import-curl-sSLhttps://rv......
  • 基于javaweb的茶园茶农文化交流平台
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器后台路径地址:localhost:8080/项目名称/admin/dist/index.html前台路径地址:localhost:80......
  • Redis 厨神:用 StringRedisTemplate 轻松获取数据的秘笈
    前言在这个快节奏的时代,数据处理就像烹饪,既需要精准的配料,又需要高超的烹饪技巧。想象一下,你在厨房里忙得不可开交,却被突如其来的订单搞得手忙脚乱。今天,我们要揭开如何用StringRedisTemplate轻松获取数据的秘密,让你在SpringBoot3.x的世界里,摇身一变,成为Redis的厨房大......
  • 555.经典的三联书店网页 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有各行各业的Web前端网页制作的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • HarmonyOS:基于Web组件构建网络应用(2)
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18502207➤如果链接不是为敢技术的博客园地址,则可......
  • iis部署tms web core
    iis部署tmswebcore首先准备好你要发布的网站文件夹 1)iis设置网站2)1、打开“IIS信息服务管理器”——》选择你发布的网站——》选择功能视图中的“身份验证”——》右键匿名身份验证,选择“编辑”,选择“特定用户IUSR”;2、右键要发布的网站文件夹,选择“安全”——》“编辑......
  • 【接口】websocket
    背景HTTP(超文本传输协议)缺点:缺乏数据加密、身份验证和会话管理等安全特性;HTTP链接的半双工的,而且通信只能由客户端发起,服务端无法将数据主动推送给客户端HTTPS(安全超文本传输协议):为了解决HTTP的缺点,提出HTTPS,提供传输的安全性websocket:为了解决"HTTP链接的半双工的,而且通信只......