docs.rs failed to build secra-cache-0.1.1
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build:
secra-cache-0.1.4
Secra Cache
一个基于 Redis 的统一缓存管理库,专为插件化架构设计,提供强隔离、生命周期管理和极简 API。
📋 目录
✨ 功能特性
- 统一治理:所有缓存操作必须通过
CacheManager,插件不能直接访问 Redis - 强隔离:每个插件拥有独立的命名空间,避免 Key 冲突
- 生命周期管理:插件卸载/升级时自动清理相关缓存
- 极简 API:插件侧 API 简单易用,隐藏 Redis 细节
- 可扩展性:支持未来扩展(配额、监控、限流等)
- 异步支持:基于 Tokio 异步运行时,高性能
- 类型安全:利用 Rust 类型系统,编译时保证安全
🚀 快速开始
安装
在 Cargo.toml 中添加依赖:
[]
= "0.1.1"
运行示例
项目提供了一个完整的示例,展示所有主要功能:
# 确保 Redis 服务正在运行(默认 localhost:6379)
# 或设置环境变量指定 Redis 地址
# 运行示例
示例演示了以下功能:
- 创建 CacheManager 和插件缓存实例
- 基本缓存操作(set、get、delete、exists)
- TTL 管理(设置、查询、延长过期时间)
- 循环操作(模拟批量操作)
- 模块化缓存管理
- 插件生命周期管理
- Redis 连接健康检查
- 错误处理
基本使用
基座系统
use CacheManager;
// 1. 创建 CacheManager
let cache_manager = new_with_defaults.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?;
// 方式 2: 使用自定义配置
let config = CacheConfig ;
let cache_manager = new.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:实现步骤和最佳实践
🔧 依赖项
主要依赖:
redis: 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 中提交