1 个不稳定版本
0.1.0 | 2024年3月3日 |
---|
#1960 在 数据库接口
12KB
73 行
tower-sessions-sled-store
Sled的塔楼会话后端
概述
此crate为tower-session会话管理crate提供Sled后端。
稳定性说明
sled库尚未发布1.0版本。根据sled开发者的说法,版本1.0将彻底重写磁盘格式,可能需要额外的数据迁移努力。
性能说明
虽然sled在一般任务中表现良好,但使用sled作为会话存储时删除过期的记录可能会导致速度减慢。
由于sled是一个简单的键值数据库,检查每个键的过期时间需要迭代数据库中的每个键。这可能导致高活跃会话数时的性能问题。
使用方法
创建SledStore
只需一个sled Tree
使用示例
use std::net::SocketAddr;
use axum::{response::IntoResponse, routing::get, Router};
use serde::{Deserialize, Serialize};
use time::Duration;
use tower_sessions::{Expiry, Session, SessionManagerLayer};
use tower_sessions_sled_store::SledStore;
const COUNTER_KEY: &str = "counter";
#[derive(Default, Deserialize, Serialize)]
struct Counter(usize);
async fn handler(session: Session) -> impl IntoResponse {
let counter: Counter = session.get(COUNTER_KEY).await.unwrap().unwrap_or_default();
session.insert(COUNTER_KEY, counter.0 + 1).await.unwrap();
format!("Current count: {}", counter.0)
}
#[tokio::main]
async fn main() {
// Open a new sled database
let sled = sled::open("storage").unwrap();
// Open a tree named session within that database
let session_store = SledStore::new(sled.open_tree("session").unwrap());
let session_layer = SessionManagerLayer::new(session_store)
.with_secure(false)
.with_expiry(Expiry::OnInactivity(Duration::seconds(10)));
let app = Router::new().route("/", get(handler)).layer(session_layer);
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
axum::serve(listener, app.into_make_service())
.await
.unwrap();
}
依赖关系
~7–15MB
~172K SLoC