#会话管理 #塔楼会话 #会话存储 #sled #后端 #序列化 #需求

tower-sessions-sled-store

Sled会话存储。不建议直接使用;请参阅tower-sessions crate以获取详细信息。

1 个不稳定版本

0.1.0 2024年3月3日

#1960数据库接口

MIT 许可证

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