Secra Cache
一个基于 Redis 的统一缓存管理库,专为插件化架构设计,提供强隔离、生命周期管理和极简 API。
📋 目录
✨ 功能特性
- 统一治理:所有缓存操作必须通过
CacheManager,插件不能直接访问 Redis - 强隔离:每个插件拥有独立的命名空间,避免 Key 冲突
- 生命周期管理:插件卸载/升级时自动清理相关缓存
- 极简 API:插件侧 API 简单易用,隐藏 Redis 细节
- 可扩展性:支持未来扩展(配额、监控、限流等)
- 异步支持:基于 Tokio 异步运行时,高性能
- 类型安全:利用 Rust 类型系统,编译时保证安全
🚀 快速开始
安装
在 Cargo.toml 中添加依赖:
[]
= { = "0.1.2", = ["rustis"] }
运行示例
项目提供了一个完整的示例,展示所有主要功能:
# 确保 Redis 服务正在运行(默认 localhost:6379)
# 或设置环境变量指定 Redis 地址
# 运行示例
示例演示了以下功能:
- 创建 CacheManager 和插件缓存实例
- 基本缓存操作(set、get、delete、exists)
- TTL 管理(设置、查询、延长过期时间)
- 循环操作(模拟批量操作)
- 模块化缓存管理
- 插件生命周期管理
- Redis 连接健康检查
- 错误处理
基本使用
基座系统
use CacheManager;
// 1. 创建 CacheManager
let cache_manager = new_with_defaults.await?;
// 或者:传入已创建的 Redis client
// let client = rustis::client::Client::connect("redis://localhost:6379").await?;
// let cache_manager = CacheManager::new_with_client_defaults(client).await?;
// 2. 为插件创建 Cache 实例
let plugin_cache = cache_manager.create_plugin_cache;
插件代码
use Cache;
use ;
// 1. 设置缓存
let user = User ;
plugin_cache.set.await?;
// 2. 获取缓存
let user: = plugin_cache.get.await?;
// 3. 删除缓存
plugin_cache.delete.await?;
// 4. 检查缓存是否存在
let exists = plugin_cache.exists.await?;
// 5. 清理所有缓存
plugin_cache.clear.await?;
// 6. 按模块清理缓存
plugin_cache.clear_module.await?; // 清理 user 模块的所有缓存
📖 使用文档
基座系统集成
基座系统负责创建和管理 CacheManager 实例,并为每个插件创建独立的缓存实例。
创建 CacheManager
use ;
// 方式 1: 使用默认配置
let cache_manager = new_with_defaults.await?;
// 方式 1.1: 传入已创建的 Redis client(默认配置)
// let client = rustis::client::Client::connect("redis://localhost:6379").await?;
// let cache_manager = CacheManager::new_with_client_defaults(client).await?;
// 方式 2: 使用自定义配置
let config = CacheConfig ;
let cache_manager = new.await?;
// 方式 2.1: 传入已创建的 Redis client(自定义配置)
// let client = rustis::client::Client::connect("redis://localhost:6379").await?;
// let cache_manager = CacheManager::new_with_client(client, config).await?;
为插件创建缓存实例
// 为插件创建缓存实例
let plugin_cache = cache_manager.create_plugin_cache;
// 插件卸载时,清理该插件的所有缓存
cache_manager.remove_plugin_cache.await?;
插件使用
插件通过 Cache trait 提供的 API 进行缓存操作,无需关心 Redis 细节。
基本操作
use Cache;
use ;
// 设置缓存(无 TTL)
let product = Product ;
cache.set.await?;
// 设置缓存(带 TTL,单位:秒)
cache.set.await?;
// 获取缓存
match cache..await?
// 删除缓存
cache.delete.await?;
// 检查缓存是否存在
if cache.exists.await?
批量操作
// 批量设置
let mut items = Vecnew;
items.push;
items.push;
cache.set_many.await?;
// 批量获取
let keys = vec!;
let values: = cache.get_many.await?;
// 批量删除
cache.delete_many.await?;
模块化缓存管理
// 按模块设置缓存(推荐)
cache.set.await?; // user 模块
cache.set.await?; // order 模块
// 清理特定模块的所有缓存
cache.clear_module.await?; // 只清理 user 模块的缓存
// 清理所有缓存
cache.clear.await?; // 清理该插件的所有缓存
TTL 管理
// 设置 TTL
cache.set_ttl.await?;
// 获取剩余 TTL(秒)
let ttl = cache.get_ttl.await?;
match ttl
// 移除 TTL(使 Key 永久有效)
cache.remove_ttl.await?;
🔑 Key 格式规范
所有 Redis Key 必须遵循以下格式:
{system}:{plugin_id}:{biz}:{key}
格式说明
{system}: 系统前缀,默认secra,可通过配置修改{plugin_id}: 插件 ID,由基座系统传入{biz}: 业务模块标识,建议使用业务领域名称(如user、order){key}: 具体的缓存键
示例
secra:user_plugin:user:123
secra:order_service:order:2024:001
secra:payment_plugin:payment:txn:abc123
命名建议
- 业务模块 (
biz):使用小写字母和下划线,如user_profile、order_list - 缓存键 (
key):使用有意义的标识符,如用户 ID、订单号等 - 避免冲突:不同业务模块使用不同的
biz前缀
⚙️ 配置说明
CacheConfig
use CacheConfig;
let config = CacheConfig ;
环境变量支持
可以通过环境变量配置 Redis 连接:
🛠️ API 参考
Cache Trait
Cache trait 定义了插件可用的所有缓存操作:
CacheManager
❌ 错误处理
CacheError
所有操作可能返回 CacheError:
use CacheError;
match cache..await
错误类型
RedisError: Redis 连接或操作错误SerializationError: 序列化/反序列化错误InvalidKeyError: Key 格式错误TimeoutError: 操作超时
💡 最佳实践
1. 使用模块化 Key 设计
// ✅ 推荐:使用模块前缀
cache.set.await?;
cache.set.await?;
cache.set.await?;
// ❌ 不推荐:扁平化 Key
cache.set.await?;
cache.set.await?;
2. 合理设置 TTL
// 根据数据特性设置 TTL
cache.set.await?; // 用户数据:1 小时
cache.set.await?; // 热点新闻:5 分钟
cache.set.await?; // 配置数据:永久
3. 使用批量操作提高性能
// ✅ 推荐:批量操作
let keys = vec!;
let users: = cache.get_many.await?;
// ❌ 不推荐:循环单个操作
for key in keys
4. 插件卸载时清理缓存
// 基座系统:插件卸载时
cache_manager.remove_plugin_cache.await?;
5. 处理缓存未命中
match cache..await?
6. 类型安全
// ✅ 推荐:使用强类型
cache.set.await?;
let user: = cache.get.await?;
// ❌ 不推荐:使用字符串
cache.set.await?;
📚 设计文档
详细的设计文档请参考项目文档目录(如果存在):
01-架构设计.md:整体架构和调用关系02-Key设计规范.md:Key 命名规范和隔离机制03-核心能力设计.md:get/set/del/exists、TTL、序列化04-生命周期管理.md:插件卸载/升级时的缓存清理05-接口设计.md:Cache trait、CacheManager、使用示例06-进阶能力.md:批量操作、分布式锁、防穿透/雪崩07-反模式与约束.md:禁止行为和强制约束08-实现指南.md:实现步骤和最佳实践
🔧 依赖项
主要依赖:
rustis: Redis 客户端serde/serde_json: 序列化/反序列化tokio: 异步运行时async-trait: 异步 trait 支持dashmap: 并发数据结构tracing: 结构化日志thiserror: 错误处理
详细依赖信息请参考 DEPENDENCIES.md。
📝 许可证
本项目采用双重许可证:
- MIT License - 详见 LICENSE-MIT
- Apache License 2.0 - 详见 LICENSE-APACHE
您可以选择任一许可证使用本项目。
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📞 联系方式
- 项目仓库: https://github.com/secra/secra-cache
- 问题反馈: 请在 GitHub Issues 中提交