Rust Web存储解决方案deno_webstorage的使用:实现浏览器式localStorage和sessionStorage的跨平台数据持久化
Rust Web存储解决方案deno_webstorage的使用:实现浏览器式localStorage和sessionStorage的跨平台数据持久化
deno_webstorage是一个实现了WebStorage规范的Rust crate,可以在Deno环境中使用。它提供了类似浏览器中localStorage和sessionStorage的API,实现跨平台的数据持久化存储。
安装
在项目目录中运行以下Cargo命令:
cargo add deno_webstorage
或者在Cargo.toml中添加:
deno_webstorage = "0.207.0"
使用示例
下面是一个完整的示例demo,展示如何使用deno_webstorage实现类似浏览器中的localStorage和sessionStorage功能:
use deno_webstorage::WebStorage;
use std::path::Path;
fn main() {
// 创建WebStorage实例
// 第一个参数是存储路径,第二个参数是存储大小限制(字节)
let localStorage = WebStorage::new(Path::new("local_storage"), 1024 * 1024).unwrap();
let sessionStorage = WebStorage::new(Path::new("session_storage"), 1024 * 1024).unwrap();
// 存储数据
localStorage.set_item("username", "rust_user").unwrap();
sessionStorage.set_item("session_token", "abc123").unwrap();
// 读取数据
let username = localStorage.get_item("username").unwrap();
let token = sessionStorage.get_item("session_token").unwrap();
println!("Username: {:?}", username); // 输出: Some("rust_user")
println!("Token: {:?}", token); // 输出: Some("abc123")
// 删除数据
localStorage.remove_item("username").unwrap();
sessionStorage.remove_item("session_token").unwrap();
// 清空存储
localStorage.clear().unwrap();
sessionStorage.clear().unwrap();
// 获取存储长度
let local_len = localStorage.length().unwrap();
let session_len = sessionStorage.length().unwrap();
println!("Local storage length: {}", local_len);
println!("Session storage length: {}", session_len);
}
主要功能
set_item(key, value)
- 存储键值对数据get_item(key)
- 获取指定键的值remove_item(key)
- 删除指定键的数据clear()
- 清空所有存储数据length()
- 获取存储的项目数量
注意事项
-
localStorage和sessionStorage的主要区别在于持久性:
- localStorage数据会持久保存,即使关闭程序
- sessionStorage数据只在当前会话有效,程序关闭后消失
-
需要指定存储路径和大小限制
-
所有操作返回Result类型,需要处理可能的错误
这个crate遵循HTML5的WebStorage规范,提供了与浏览器存储API高度兼容的接口,非常适合需要在Rust中实现跨平台持久化存储的场景。
1 回复
Rust Web存储解决方案:deno_webstorage
deno_webstorage 是一个 Rust 库,为 Deno 和 Rust 应用程序提供了类似浏览器中 localStorage 和 sessionStorage 的 API,实现了跨平台的数据持久化功能。
功能特点
- 提供与 Web Storage API 兼容的接口
- 支持 localStorage(持久化存储)和 sessionStorage(会话存储)
- 跨平台支持(包括 Windows、macOS 和 Linux)
- 线程安全的设计
- 简单的键值存储接口
安装方法
在 Cargo.toml 中添加依赖:
[dependencies]
deno_webstorage = "0.1"
基本使用方法
初始化存储
use deno_webstorage::{WebStorage, StorageType};
fn main() {
// 创建 localStorage
let local_storage = WebStorage::new(StorageType::Local, "/path/to/storage/dir").unwrap();
// 创建 sessionStorage
let session_storage = WebStorage::new(StorageType::Session, "/path/to/storage/dir").unwrap();
}
基本操作示例
use deno_webstorage::{WebStorage, StorageType};
fn main() {
let storage = WebStorage::new(StorageType::Local, "./storage").unwrap();
// 设置值
storage.set_item("username", "rustacean").unwrap();
// 获取值
let username = storage.get_item("username").unwrap();
println!("Username: {}", username); // 输出: Username: rustacean
// 删除值
storage.remove_item("username").unwrap();
// 清空存储
storage.clear().unwrap();
// 获取存储中的键数量
let length = storage.length().unwrap();
println!("Storage contains {} items", length);
}
遍历存储内容
use deno_webstorage::{WebStorage, StorageType};
fn main() {
let storage = WebStorage::new(StorageType::Local, "./storage").unwrap();
// 添加一些数据
storage.set_item("key1", "value1").unwrap();
storage.set_item("key2", "value2").unwrap();
storage.set_item("key3", "value3").unwrap();
// 遍历所有键
for i in 0..storage.length().unwrap() {
if let Some(key) = storage.key(i).unwrap() {
let value = storage.get_item(&key).unwrap();
println!("{}: {}", key, value);
}
}
}
高级用法
使用自定义序列化
use deno_webstorage::{WebStorage, StorageType};
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
struct User {
id: u32,
name: String,
email: String,
}
fn main() {
let storage = WebStorage::new(StorageType::Local, "./storage").unwrap();
let user = User {
id: 1,
name: "Alice".to_string(),
email: "alice@example.com".to_string(),
};
// 序列化并存储
let serialized = serde_json::to_string(&user).unwrap();
storage.set_item("user1", &serialized).unwrap();
// 读取并反序列化
let stored = storage.get_item("user1").unwrap();
let deserialized: User = serde_json::from_str(&stored).unwrap();
println!("User: {:?}", deserialized);
}
错误处理
use deno_webstorage::{WebStorage, StorageType, WebStorageError};
fn main() -> Result<(), WebStorageError> {
let storage = WebStorage::new(StorageType::Local, "./storage")?;
storage.set_item("test_key", "test_value")?;
match storage.get_item("non_existent_key") {
Ok(value) => println!("Got value: {}", value),
Err(WebStorageError::KeyNotFound) => println!("Key not found"),
Err(e) => return Err(e),
}
Ok(())
}
完整示例代码
下面是一个结合了基本使用和高级用法的完整示例:
use deno_webstorage::{WebStorage, StorageType, WebStorageError};
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
struct AppConfig {
theme: String,
notifications: bool,
last_login: String,
}
fn main() -> Result<(), WebStorageError> {
// 初始化本地存储
let storage = WebStorage::new(StorageType::Local, "./my_app_data")?;
// 示例1: 基本键值操作
println!("--- 基本键值操作 ---");
storage.set_item("app_name", "MyRustApp")?;
storage.set_item("app_version", "1.0.0")?;
println!("App Name: {}", storage.get_item("app_name")?);
println!("App Version: {}", storage.get_item("app_version")?);
// 示例2: 存储和检索结构体
println!("\n--- 结构体存储 ---");
let config = AppConfig {
theme: "dark".to_string(),
notifications: true,
last_login: "2023-05-15".to_string(),
};
let serialized = serde_json::to_string(&config).unwrap();
storage.set_item("user_config", &serialized)?;
let stored_config = storage.get_item("user_config")?;
let deserialized: AppConfig = serde_json::from_str(&stored_config).unwrap();
println!("Config: {:?}", deserialized);
// 示例3: 遍历存储内容
println!("\n--- 存储内容遍历 ---");
println!("Total items in storage: {}", storage.length()?);
for i in 0..storage.length()? {
if let Some(key) = storage.key(i)? {
println!("Key {}: {}", i, key);
}
}
// 示例4: 错误处理
println!("\n--- 错误处理 ---");
match storage.get_item("non_existent_key") {
Ok(value) => println!("Found value: {}", value),
Err(WebStorageError::KeyNotFound) => println!("Key does not exist"),
Err(e) => return Err(e),
}
// 清理示例数据
storage.remove_item("app_name")?;
storage.remove_item("app_version")?;
storage.remove_item("user_config")?;
Ok(())
}
注意事项
- 确保存储目录有正确的读写权限
- sessionStorage 在程序退出后数据会丢失,而 localStorage 会持久化保存
- 存储的数据大小有限制(通常为 5MB 左右)
- 在多线程环境中使用时,确保正确处理并发访问
deno_webstorage 为 Rust 应用程序提供了简单易用的 Web 存储风格 API,特别适合需要轻量级持久化存储的场景。