
缓存接口
大约 4 分钟
概述
缓存系统基于Rust技术栈实现,支持多种缓存存储方式,提供统一的操作接口,核心特性和实现细节如下:
1. 核心架构与设计
多存储后端支持
系统采用抽象接口与具体实现分离的设计,通过Cache
枚举统一封装两种缓存后端:
- Redis:分布式缓存,适用于多实例部署场景,依赖
bb8-redis
连接池管理连接。 - Memory:内存缓存,基于
DashMap
实现线程安全存储,适用于单实例轻量场景。
缓存类型通过配置文件指定(cache_type
字段),默认支持redis
和memory
两种类型。
核心数据结构
Cache
枚举(src/cache/mod.rs
):统一对外接口,根据配置动态选择Redis或内存实现。CacheProvider
trait(src/cache/traits.rs
):定义缓存操作标准接口,确保不同后端实现一致性。MemoryItem
结构体(src/cache/memory.rs
):内存缓存的原子单元,包含值、过期时间等元数据。
2. 核心功能与接口
基础键值操作
- 字符串存储:
set_string
/get_string
用于直接存储字符串,set_string_ex
支持设置过期时间(秒级)。 - 序列化存储:
set_value
/get_value
通过serde_json
自动序列化/反序列化任意类型数据。 - 过期与删除:
ttl
查询剩余过期时间,remove
删除键,get_one_use
获取值后自动删除(一次性键)。
示例代码:
// 存储并自动序列化对象
let user = User { id: 1, name: "test" };
cache.set_value("user:1", &user).await?;
// 读取并反序列化
let user: User = cache.get_value("user:1").await?;
高级数据结构
支持Redis风格的复杂数据结构操作:
- 列表(List):
lpush
添加元素,brpop
阻塞式弹出元素。 - 集合(Set):
sadd
添加成员。 - 有序集合(Sorted Set):
zadd
添加带分数的元素,zrange
/zrangebyscore_limit
查询元素。
命名空间隔离
通过namespace
机制实现键隔离,避免不同模块键冲突:
- 初始化时指定默认命名空间(如
qiluo
),键存储格式为{namespace}:{key}
。 - 可通过
with_namespace
创建新的命名空间实例,或set_namespace
动态切换。
缓存管理
- 批量查询:
get_all
获取所有键值对,get_all_paginated
支持分页和关键词搜索。 - 过期清理:内存缓存通过定时任务(每分钟一次)清理过期键,Redis依赖自身过期机制。
3. 实现细节
内存缓存(MemoryCache
)
- 存储结构:
- 字符串键值对:
DashMap<String, MemoryItem>
(支持并发读写)。 - 列表:
DashMap<String, Vec<String>>
。 - 集合:
DashMap<String, DashMap<String, bool>>
。 - 有序集合:
DashMap<String, Vec<(String, f64)>>
。
- 字符串键值对:
- 过期机制:启动后台任务每分钟清理过期项,访问时也会检查过期状态并删除。
Redis缓存(RedisCache
)
- 连接管理:使用
bb8
连接池维护Redis连接,避免频繁创建连接开销。 - 命令映射:通过
redis
crate直接调用Redis命令,确保功能完整性。 - 命名空间处理:自动为键添加命名空间前缀,
brpop
等命令返回时会还原原始键名。
全局实例管理
通过OnceCell
创建全局缓存实例(GLOBAL_CACHE
),确保应用内单例:
// 初始化全局缓存
CacheManager::init().await?;
// 获取实例
let cache = CacheManager::instance().await;
4. 配置与初始化
配置参数(src/config/appconfig.rs
)
pub struct CacheConfig {
pub cache_type: String, // 缓存类型:redis/memory
pub namespace: Option<String>, // 默认命名空间
pub url: Option<String>, // Redis连接地址(redis类型必填)
pub pool_size: Option<u32>, // 内存缓存池大小(memory类型必填)
}
初始化流程
- 读取配置文件,根据
cache_type
选择后端。 - 验证配置合法性(如Redis URL非空、内存池大小非空)。
- 创建对应缓存实例并存储到
GLOBAL_CACHE
。
5. 关键代码模块
模块路径 | 功能 |
---|---|
src/cache/mod.rs | 定义Cache 枚举及全局实例管理,统一缓存操作入口。 |
src/cache/traits.rs | 定义CacheProvider trait,规范缓存操作接口。 |
src/cache/memory.rs | 内存缓存实现,包含数据结构、过期清理等逻辑。 |
src/cache/redis.rs | Redis缓存实现,基于Redis命令映射。 |
src/service/sys/s_sys_cache.rs | 提供缓存管理API(列表查询、清空等)。 |
6. 应用场景
- 系统缓存:存储用户会话、权限信息等高频访问数据。
- 任务队列依赖:作为任务队列(如定时任务、异步任务)的底层存储(通过列表、有序集合实现)。
- 接口性能优化:缓存数据库查询结果,减少DB访问压力。
综上,该缓存系统通过统一接口抽象实现了多后端支持,兼顾分布式与轻量场景,提供丰富的数据结构操作和管理功能,适用于企业级应用的缓存需求。