当前位置: 首页 > news >正文

Rust操作redis

Rust操作redis

toml

[dependencies]
redis = { version = "1.2", features = ["tokio-comp",            # 异步支持"connection-manager",    # 内置连接池"tokio-native-tls-comp",
] }
tokio = { version = "1", features = ["full"] }
anyhow = "1.0"

选不同的redis库、密码校验 redis://:密码@172.17.0.185:6379/库

密码模式
let client = Client::open("redis://:b7371d927aec647d@172.17.0.185:6379/1")?;
简单模式
let client = Client::open("redis://127.0.0.1:6379")?;

同步模式

use anyhow::Result;
use redis::{Client, Commands};fn main() -> Result<()> {// 创建 Redis 客户端let client = Client::open("redis://127.0.0.1:6379")?;// 获取连接(同步连接)let mut conn = client.get_connection()?;// 字符串操作:SET / GETlet _: () = conn.set("username", "rust_dev")?; // SET 命令,返回空元组let username: Option<String> = conn.get("username")?; // GET 命令,返回 Option(避免空值 panic)println!("获取 username: {:?}", username); // 输出:Some("rust_dev")// 哈希操作:HSET / HGET / HGETALLlet _: () = conn.hset("user:1", "id", 1)?;let _: () = conn.hset("user:1", "name", "Alice")?;let user_name: Option<String> = conn.hget("user:1", "name")?;let user: Option<redis::Value> = conn.hgetall("user:1")?; // 获取整个哈希println!("获取用户名称: {:?}", user_name); // 输出:Some("Alice")println!("获取用户全部信息: {:?}", user);// 列表操作:LPUSH / LRANGElet _: () = conn.lpush("tasks", "learn redis")?;let _: () = conn.lpush("tasks", "learn rust")?;let tasks: Vec<String> = conn.lrange("tasks", 0, -1)?; // 获取所有列表元素println!("任务列表: {:?}", tasks); // 输出:["learn rust", "learn redis"]// 删除操作:DELlet _: () = conn.del("username")?;Ok(())
}

异步

use anyhow::Result;
use redis::{AsyncCommands, Client,SetExpiry,cmd};
#[tokio::main]
async  fn main() -> Result<()> {// 创建 Redis 客户端let client = Client::open("redis://:b7371d927aec647d@172.17.0.185:6379/1")?;// 获取连接(同步连接)let mut conn = client.get_multiplexed_async_connection().await?;// 字符串操作:SET / GETlet _: () = conn.set("username", "rust_dev").await?; // SET 命令,返回空元组// 对已有键设置 10 秒后过期let _: () = conn.expire("username", 10).await?;// 设置键 "temp_key" 的值为 "hello",并在 60 秒后自动删除let _: () = conn.set_ex("temp_key", "hello", 60).await?;// 设置毫秒let _: () = cmd("PSETEX").arg("my_key").arg(15000).arg("my_value").query_async(&mut conn).await?;let username: Option<String> = conn.get("username").await?; // GET 命令,返回 Option(避免空值 panic)println!("获取 username: {:?}", username); // 输出:Some("rust_dev")// 哈希操作:HSET / HGET / HGETALLlet _: () = conn.hset("user:1", "id", 1).await?;let _: () = conn.hset("user:1", "name", "Alice").await?;let user_name: Option<String> = conn.hget("user:1", "name").await?;let user: Option<redis::Value> = conn.hgetall("user:1").await?; // 获取整个哈希println!("获取用户名称: {:?}", user_name); // 输出:Some("Alice")println!("获取用户全部信息: {:?}", user);// 列表操作:LPUSH / LRANGElet _: () = conn.lpush("tasks", "learn redis").await?;let _: () = conn.lpush("tasks", "learn rust").await?;let tasks: Vec<String> = conn.lrange("tasks", 0, -1).await?; // 获取所有列表元素println!("任务列表: {:?}", tasks); // 输出:["learn rust", "learn redis"]// 删除操作:DELlet _: () = conn.del("username").await?;Ok(())
}

连接池

use anyhow::Result;
use redis::{AsyncCommands, Client};#[tokio::main]
async fn main() -> Result<()> {// 创建 Redis 客户端let client = Client::open("redis://127.0.0.1:6379")?;// 创建连接池,默认配置// 另外可提供 get_connection_manager_with_config 自定义最大连接数、超时时间等let mut conn_manager = client.get_connection_manager().await?;// 从连接池获取连接并执行操作(自动复用连接)for i in 0..5 {let key = format!("pool_key:{}", i);let _: () = conn_manager.set(&key, i).await?;let value: Option<i32> = conn_manager.get(&key).await?;println!("连接池操作 {}: {:?}", key, value);}Ok(())
}

管道Pipeline

use anyhow::Result;
use redis::{Client, pipe};#[tokio::main]
async fn main() -> Result<()> {let client = Client::open("redis://127.0.0.1:6379")?;let mut conn = client.get_connection()?;// 创建管道,批量执行 SET 命令(无返回值)pipe().set("pipe_key1", "value1").set("pipe_key2", "value2").set("pipe_key3", "value3").exec(&mut conn)?;println!("管道批量 SET 执行完成");// 批量执行 GET 命令(获取返回值)let (val1, val2, val3): (Option<String>, Option<String>, Option<String>) = pipe().get("pipe_key1").get("pipe_key2").get("pipe_key3").query(&mut conn)?;println!("管道批量 GET 结果: {:?}, {:?}, {:?}", val1, val2, val3);Ok(())
}

事务(Transaction)

use anyhow::Result;
use redis::{Client, pipe};#[tokio::main]
async fn main() -> Result<()> {let client = Client::open("redis://127.0.0.1:6379")?;let mut conn = client.get_connection()?;// 开启事务let mut pipe = pipe();pipe.atomic();// 向事务中添加命令pipe.set("tx_key1", "tx_val1").hset("tx_user:1", "name", "Bob").lpush("tx_tasks", "finish transaction");// 执行事务(通过 query 发送所有命令)let results: Vec<redis::Value> = pipe.query(&mut conn)?;println!("事务执行结果: {:?}", results);Ok(())
}

Lua 脚本

use anyhow::Result;
use redis::{Client, Script};// 定义结构体
#[tokio::main]
async fn main() -> Result<()> {let client = Client::open("redis://127.0.0.1:6379")?;let mut conn = client.get_multiplexed_async_connection().await?;// 定义 Lua 脚本:自增指定 key,返回自增后的值let lua_script = Script::new(r#"local key = KEYS[1]-- 调用 Redis 原生命令 INCR,实现自增return redis.call('INCR', key)"#,);// 执行脚本:通过 .key() 传递 KEYS 参数let new_val: i32 = lua_script.key("simple_lua_counter") // 添加 KEY.invoke_async(&mut conn) // 执行脚本.await?;println!("Lua 脚本执行结果(自增后): {}", new_val); // 首次执行输出 1// 传递参数的简单示例,设置 key 值并返回let set_and_get_script = Script::new(r#"local key = KEYS[1]local val = ARGV[1]redis.call('SET', key, val)return val"#,);let result: String = set_and_get_script.key("lua_test_key") // 添加 KEY.arg("test_value") // 添加 ARG.invoke_async(&mut conn).await?;println!("设置并返回值: {}", result); // 输出 test_valueOk(())
}
http://www.jsqmd.com/news/821513/

相关文章:

  • 九大网盘直链下载神器:LinkSwift 终极使用指南与深度解析
  • 矿区重卡充电桩怎么选?2026年品牌深度测评 - 科技焦点
  • 嵌入式系统引导加载程序(Bootloader)设计:从基础原理到工业级实现
  • DevChat:基于工作区模型的AI编程助手,实现上下文感知的持续协作
  • 构建系统核心原理:从DAG调度到缓存机制的设计与实践
  • 上下文引擎:用管道模式解耦业务与横切关注点
  • 魔兽世界宏编辑器终极指南:5分钟掌握GSE高级技能自动化
  • 免费B站视频下载器终极指南:轻松获取大会员4K高清内容
  • AI开发环境隔离利器:基于Bubblewrap的轻量级沙盒实践
  • 机械密封公司排行参考:从工况适配到品控全维度解析 - 奔跑123
  • 如何3分钟搞定九大网盘文件下载:LinkSwift网盘直链助手终极指南
  • 开源协作社区工具OpenClaw Guild:构建高效开发者公会的完整指南
  • 你的差速小车为什么画圈不准?可能是数学模型离散化没搞对(避坑指南)
  • 2026昆明公司注册代办机构口碑评测,优质代理记账商标注册财税公司推荐指南 - 品牌智鉴榜
  • 2026无锡奢侈品包包回收实测:爱马仕、古驰回收报价避坑指南! - 奢侈品回收测评
  • 中药材趁鲜加工设备生产厂家汇总:2026年行业代表性企业梳理 - 品牌推荐大师1
  • 告别秒杀焦虑:Python京东自动抢购工具全解析与实战指南
  • 3步掌握RSA密钥参数计算:告别手动计算的烦恼
  • 基于MLX框架的本地AI代码执行服务器:安全沙箱与Docker隔离实践
  • 2026年花生油品牌权威榜单——两家企业上榜欧果、乳山金果! - 奔跑123
  • 2026年哈尔滨仿真草坪厂家推荐:靠谱排行必看! - 速递信息
  • 2026年雅礼中学理实班自主招生 二次函数与圆综合
  • 2026口碑最佳山东旅游/旅行/旅游接待/研学旅游/团建旅游横评:十款青岛实力品牌精准解析 - 十大品牌榜
  • 从零到一:泰凌微TLSR8269芯片上的SIG Mesh节点开发实战(附SDK源码分析)
  • 避坑指南:MPU6050低功耗中断唤醒不灵?可能是你的Cycle模式和I2C地址搞错了
  • Safe Exam Browser虚拟化环境检测绕过技术深度解析
  • CircuitPython硬件交互指南:从引脚映射到外设驱动
  • 上海亨得利手表消磁调校专业吗?2026年5月实地测评+全过程揭秘(附全国官方网点) - 亨得利腕表维修中心
  • APP内置音乐全攻略:从版权避坑到平台选择,打造沉浸式用户体验 - 拾光而行
  • 别再死记硬背了!用PyTorch代码实战理解5大2D注意力机制(附Non-Local/SE/CBAM对比)