首页 > 数据库 >axum 操作 redis

axum 操作 redis

时间:2023-11-02 09:57:19浏览次数:42  
标签:map axum err redis let user 操作 string

通过 redis-rs 这个 crate,可以很方便的操作 redis。它提供了同步和异步两种连接,由于我们要集成到 axum 中,所以这里使用异步连接。本章将展示如何获取 redis 异步连接、如何将字符串保存到 redis、如何获取到保存在 redis 里的字符串以及如何通过 redis 保存和读取自定义结构体。

获取 redis 异步连接

redis 默认端口是 6379,由于作者使用 docker 运行了多个 redis 实例,所以示例代码中可能不是redis默认端口。请根据你自身的环境将连接字符串中的主机和端口等信息进行修改。

通过 redis::Client::open()方法可以建立与 redis 服务器的连接,然后使用get_async_connection()方法获取到异步连接。

let client = Client::open("redis://127.0.0.1:16379/").unwrap();
    let  conn = client
        .get_async_connection()
        .await
        .unwrap();

其中的连接字符串(open()函数的参数)有以下几种写法(中括号内的为可选参数,尖括号内的为必填参数):

  • redis://[<用户名>][:<密码>@]<主机名>[:端口][/数据库]

  • unix:///<路径>[?db=<数据库>][&pass=<密码>][&user=<用户名>]

  • redis+unix:///<路径>[?db=<数据库>][&pass=<密码>][&user=<用户名>]

将字符串保存到 redis

调用异步连接的set()方法,可以将字符串保存到 redis:

conn.set("键名","值").await;

示例代码如下:

async fn set() -> Result<&'static str, String> {
    let client = Client::open(REDIS_DSN).map_err(|err| err.to_string())?;
    let mut conn = client
        .get_async_connection()
        .await
        .map_err(|err| err.to_string())?;
    conn.set("author", "axum.rs")
        .await
        .map_err(|err| err.to_string())?;
    Ok("Successfully set")
}

读取保存在 redis 中的字符串

异步连接的get()方法,用于从 redis 中获取指定键的数据:

let value = conn.get("键名").await;

示例代码如下:

async fn get() -> Result<String, String> {
    let client = Client::open(REDIS_DSN).map_err(|err| err.to_string())?;
    let mut conn = client
        .get_async_connection()
        .await
        .map_err(|err| err.to_string())?;
    let value = conn.get("author").await.map_err(|err| err.to_string())?;
    Ok(value)
}

由于 redis 保存的是底层的数据,所以你可以根据需要将读取到的数据进行类型转换,官方文档有示例。

自定义结构体和 redis

了解完字符串的读写操作,我们继续讨论在 redis 读写自定义结构体。

定义数据结构

#[derive(Serialize, Deserialize)]
pub struct UserInfo {
    pub id: i32,
    pub username: String,
    pub email: String,
}

将自定义结构体写入 redis 服务器

我们需要将结构体序列化为字符串,然后再写入 redis 服务器:

async fn set_user() -> Result<&'static str, String> {
    let client = Client::open(REDIS_DSN).map_err(|err| err.to_string())?;
    let mut conn = client
        .get_async_connection()
        .await
        .map_err(|err| err.to_string())?;
    let user = UserInfo {
        id: 1,
        username: "axum.rs".to_string(),
        email: "[email protected]".to_string(),
    };
    let user = json!(user);
    conn.set("user", user.to_string())
        .await
        .map_err(|err| err.to_string())?;
    Ok("Successfully set user.")
}

从 redis 中读取自定义结构体

我们需要将 redis 中读取到的字符串反序列化为自定义结构体:

async fn get_user() -> Result<Json<UserInfo>, String> {
    let client = Client::open(REDIS_DSN).map_err(|err| err.to_string())?;
    let mut conn = client
        .get_async_connection()
        .await
        .map_err(|err| err.to_string())?;
    let value: String = conn.get("user").await.map_err(|err| err.to_string())?;
    let user: UserInfo = from_str(&value).map_err(|err| err.to_string())?;
    Ok(Json(user))
}

设置自动过期

redis 支持在写入值的时候设置过期时间,时间一到,该数据自动删除:

conn.set_ex("键名","值",过期时间的秒数).await;

本章讨论了如何在 axum 集成 redis,完整代码可以在代码库中找到。

思考题

  • 本章展示的所有 handler 都有重复代码:获取 redis 连接,尝试将这段重复代码提取为独立的函数。

  • 更进一步,将写入和读取的操作封装成单独的函数。

  • 试试写入一个 30 秒过期的数据。

标签:map,axum,err,redis,let,user,操作,string
From: https://www.cnblogs.com/pythonClub/p/17804729.html

相关文章

  • axum处理静态文件
    和其它Web框架一样,axum也会对所有请求进行处理。对于CSS、JS及图片等静态文件,并不需要axum的handler进行处理,而是只需要简单的把它们的内容进行返回即可。axum提供了处理静态文件的中间件。首先,我们创建一个名为 static 的目录,并在其中创建一个 axum-rs.txt 的文......
  • axum的状态共享
    状态共享是指,在整个应用或不同路由之间,共享一份数据。axum提供了方便的状态共享机制,但可能也会踩坑。本章将带你学习如何在axumweb应用中共享状态。如何进行状态共享axum使用 Layer 来实现状态共享。定义路由时,使用 layer() 加入要共享的数据,在需要获取该共享数据的......
  • 基于Redis的Set、Zset类型实现好友关注,共同好友(求并集)
    好友关注@OverridepublicResultfollow(LongfollowUserId,BooleanisFollow){//1.获取登录用户LonguserId=UserHolder.getUser().getId();Stringkey="follows:"+userId;//1.判断到底是关注还是取关if(isFollow)......
  • Redis安装-Docker版
    Redis安装docker版拉去镜像dockerpullredis准备目录#redis文件配置目录mkdir-p/data/redis/conf#持久化文件存放目录mkdir-p/data/redis/data编写配置文件命名为redis.conf,内容填写如下,将文件放入上面建好的/data/redis/conf目录中。redis配置文件#在redis......
  • Redis-GUI [图形化桌面客户端工具]
    推荐一:【Redis图形化桌面客户端下载地址:https://github.com/lework/RedisDesktopManager-Windows/releases】 解压zip文件, 点击exe,正常安装即可,打开页面如下: 推荐二:【Redis图形化桌面客户端下载地址:https://github.com/qishibo/AnotherRedisDesktopManager/releases......
  • 刘铭诚:11.1-2美盘黄金行情涨跌走势解析及期货原油价格操作建议
    黄金行情走势分析——白盘波动不大,午间下跌预期给到1975一线入场多单,目前到达1983一线,短线拿到8个点。整体来看今日的波动振幅还没有打开,但是从相关美元指数来看比较利好美元,目前更是来到106.85.晚间有望向107水平关口发起冲锋,届时黄金还会承受打击下跌。昨日黄金受到多次......
  • Linux操作系统
    一.什么是LinuxLinux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。二.Linux的特点(1)Linux是一款免费的操作系统,用户可以通过网络或......
  • Redis的四种部署方案
    这篇文章介绍Reids最为常见的四种部署模式,其实Reids和数据库的集群模式差不多,可以分为Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署,其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境,最常见的还是集群模式的部署接下来我们来......
  • 19、模糊查询操作符详解
    模糊查询:本质是比较运算符运算符语法描述isnullaisnull如果操作符为null,则结果为真isnotnullaisnotnull如果操作符不为null,则结果为真betweenabetweenbandc若a在b和c之间,则结果为真likealikebSQL匹配,如果a匹配到b,则结果为真inain(a1......
  • 解题报告 P2572 [SCOI2010] 序列操作
    P2572[SCOI2010]序列操作线段树。首先对于一个区间,我们需要存储\(8\)个量来保证算出答案:\(1\)的个数,\(0\)的个数,最左边连续\(1/0\)个数,最右边连续\(1/0\)个数,区间内最长连续\(1/0\)个数。可以如下定义一个节点:structnode{ intcnt1,cnt0,ls1,ls0,rs1,rs0,ss1,s......