pub struct RedisStorage { /* private fields */ }Expand description
Redis存储实现
Implementations§
Source§impl RedisStorage
impl RedisStorage
Sourcepub async fn new(
redis_url: &str,
key_prefix: impl Into<String>,
) -> Result<RedisStorage, StorageError>
pub async fn new( redis_url: &str, key_prefix: impl Into<String>, ) -> Result<RedisStorage, StorageError>
使用 Redis URL 创建存储
§参数
redis_url- Redis 连接 URLkey_prefix- 键前缀(例如:sa-token:)
§URL 格式
- 无密码:
redis://localhost:6379/0 - 有密码:
redis://:password@localhost:6379/0 - 复杂密码:
redis://:Aq23-hjPwFB3mBDNFp3W1@localhost:6379/0
§示例
ⓘ
use sa_token_storage_redis::RedisStorage;
// 无密码
let storage = RedisStorage::new("redis://localhost:6379/0", "sa-token:").await?;
// 有密码
let storage = RedisStorage::new(
"redis://:Aq23-hjPwFB3mBDNFp3W1@localhost:6379/0",
"sa-token:"
).await?;Sourcepub async fn from_config(
config: RedisConfig,
key_prefix: impl Into<String>,
) -> Result<RedisStorage, StorageError>
pub async fn from_config( config: RedisConfig, key_prefix: impl Into<String>, ) -> Result<RedisStorage, StorageError>
使用配置结构体创建存储
§参数
config- Redis 配置key_prefix- 键前缀(例如:sa-token:)
§示例
ⓘ
use sa_token_storage_redis::{RedisStorage, RedisConfig};
let config = RedisConfig {
host: "localhost".to_string(),
port: 6379,
password: Some("Aq23-hjPwFB3mBDNFp3W1".to_string()),
database: 0,
pool_size: 10,
};
let storage = RedisStorage::from_config(config, "sa-token:").await?;Sourcepub fn builder() -> RedisStorageBuilder
pub fn builder() -> RedisStorageBuilder
Sourcepub async fn connect(redis_url: &str) -> Result<RedisStorage, StorageError>
pub async fn connect(redis_url: &str) -> Result<RedisStorage, StorageError>
便捷构造:物理前缀默认为空(逻辑键由 SaKeys 提供)
Trait Implementations§
Source§impl Clone for RedisStorage
impl Clone for RedisStorage
Source§fn clone(&self) -> RedisStorage
fn clone(&self) -> RedisStorage
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for RedisStorage
impl Debug for RedisStorage
Source§impl SaStorage for RedisStorage
impl SaStorage for RedisStorage
Source§fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
Read value by key | 按键读取值
Source§fn set<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
value: &'life2 str,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn set<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
value: &'life2 str,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
Write value with optional TTL | 写入值(可选 TTL)
Source§fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
Delete a key | 删除键
Source§fn exists<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn exists<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
Whether the key exists | 键是否存在
Source§fn expire<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
ttl: Duration,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn expire<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
ttl: Duration,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
Update key TTL | 更新键过期时间
Source§fn ttl<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Duration>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn ttl<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Duration>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
Remaining TTL, if any | 剩余过期时间(若有)
Source§fn mget<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
keys: &'life1 [&'life2 str],
) -> Pin<Box<dyn Future<Output = Result<Vec<Option<String>>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn mget<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
keys: &'life1 [&'life2 str],
) -> Pin<Box<dyn Future<Output = Result<Vec<Option<String>>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
批量读:默认逐键 get,具体后端可覆盖为 mget
Source§fn mset<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
items: &'life1 [(&'life2 str, &'life3 str)],
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
RedisStorage: 'async_trait,
fn mset<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
items: &'life1 [(&'life2 str, &'life3 str)],
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
RedisStorage: 'async_trait,
批量写:默认逐键 set
Source§fn mdel<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
keys: &'life1 [&'life2 str],
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn mdel<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
keys: &'life1 [&'life2 str],
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
批量删:默认逐键 delete
Source§fn incr<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<i64, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn incr<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<i64, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
自增:默认实现非原子(读-改-写),并发环境下计数不准确 Read more
Source§fn decr<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<i64, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn decr<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<i64, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
自减:默认实现非原子(读-改-写),语义同 incr Read more
Source§fn clear<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
RedisStorage: 'async_trait,
fn clear<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(), StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
RedisStorage: 'async_trait,
Remove all keys | 清空全部键
Source§fn set_if_absent<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
value: &'life2 str,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn set_if_absent<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
value: &'life2 str,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
仅当键不存在(或已过期)时写入;成功占位返回 true Read more
Source§fn get_del<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn get_del<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
读取并删除;保证单次消费者语义 Read more
Source§fn compare_and_swap<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 str,
expected: Option<&'life2 str>,
new_value: &'life3 str,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
RedisStorage: 'async_trait,
fn compare_and_swap<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 str,
expected: Option<&'life2 str>,
new_value: &'life3 str,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
RedisStorage: 'async_trait,
Source§fn compare_and_delete<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
expected: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn compare_and_delete<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
expected: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
比较并删除:仅当当前值等于 expected 时删除 Read more
Source§fn list_push<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
member: &'life2 str,
unique: bool,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<usize, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn list_push<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
member: &'life2 str,
unique: bool,
ttl: Option<Duration>,
) -> Pin<Box<dyn Future<Output = Result<usize, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
向集合追加成员;unique=true 时跳过重复项 Read more
Source§fn list_remove<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
member: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
fn list_remove<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 str,
member: &'life2 str,
) -> Pin<Box<dyn Future<Output = Result<bool, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
RedisStorage: 'async_trait,
从集合移除成员;返回是否确实移除
Source§fn list_range<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
start: usize,
limit: Option<usize>,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn list_range<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
start: usize,
limit: Option<usize>,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
分页读取集合成员 Read more
Source§fn list_len<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<usize, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
fn list_len<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<usize, StorageError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
RedisStorage: 'async_trait,
集合长度 Read more
Auto Trait Implementations§
impl !RefUnwindSafe for RedisStorage
impl !UnwindSafe for RedisStorage
impl Freeze for RedisStorage
impl Send for RedisStorage
impl Sync for RedisStorage
impl Unpin for RedisStorage
impl UnsafeUnpin for RedisStorage
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more