CacheHelper
CacheHelper 提供统一的缓存操作能力,支持内存缓存(Memory)和 Redis 缓存两种模式,可根据环境配置自动切换。
概述
在高频访问或计算开销较大的场景下,使用缓存可以显著提升性能。CacheHelper 提供了键值对缓存、String 缓存、Set 集合缓存等多种数据结构的操作能力。
API 方法
缓存实例
// 当前使用的缓存实例类型
CacheInstanceEnum Instance { get; } // Memory 或 Redis
键值对缓存
CacheGetAsync — 读取缓存
Task<T> CacheGetAsync<T>(string key);
示例:
// 从缓存读取数据
var userInfo = await sdk.CacheHelper.CacheGetAsync<UserInfo>("user:info:123");
if (userInfo != null)
{
// 使用缓存数据...
}
CacheSetAsync — 写入缓存
Task CacheSetAsync<T>(string key, T value, TimeSpan? expiry = null);
参数说明:
| 参数 | 说明 |
|---|---|
| key | 缓存键 |
| value | 缓存值 |
| expiry | 过期时间,null 表示永不过期 |
示例:
// 写入缓存,设置 1 小时过期
await sdk.CacheHelper.CacheSetAsync("user:info:123", userData, TimeSpan.FromHours(1));
// 写入缓存,永不过期
await sdk.CacheHelper.CacheSetAsync("app:config", configData);
KeyExistAsync — 检查键是否存在
Task<bool> KeyExistAsync(string key);
RemoveAsync — 删除缓存
Task RemoveAsync(string key);
String 缓存
StringGetAsync / StringSetAsync
以字符串形式读写缓存。
Task<string> StringGetAsync(string key);
Task StringSetAsync(string key, string value, TimeSpan? expiry = null);
示例:
// 存储计数器
await sdk.CacheHelper.StringSetAsync("visit:count:today", "0");
var count = await sdk.CacheHelper.StringGetAsync("visit:count:today");
Set 集合缓存
适用于存储无序集合数据,如标签列表、用户集合等。
// 添加成员
Task SetAddAsync(string key, string member);
Task SetAddAsync(string key, string[] members);
// 判断成员是否存在
Task<bool> SetContainsAsync(string key, string member);
// 获取所有成员
Task<string[]> SetMembersAsync(string key);
// 移除成员
Task SetRemoveAsync(string key, string member);
示例:
// 管理在线用户集合
await sdk.CacheHelper.SetAddAsync("online:users", "user-001");
await sdk.CacheHelper.SetAddAsync("online:users", new[] { "user-002", "user-003" });
// 检查用户是否在线
var isOnline = await sdk.CacheHelper.SetContainsAsync("online:users", "user-001");
// 获取所有在线用户
var onlineUsers = await sdk.CacheHelper.SetMembersAsync("online:users");
// 用户下线时移除
await sdk.CacheHelper.SetRemoveAsync("online:users", "user-001");
典型场景
缓存高频查询数据
public async Task<object> ExecuteAsync(ComponentContext context, ChameleonSDK sdk)
{
var cacheKey = $"dept:tree:{context.TenantId}";
// 先尝试从缓存获取
var deptTree = await sdk.CacheHelper.CacheGetAsync<DepartmentTree>(cacheKey);
if (deptTree == null)
{
// 缓存未命中,从数据库查询
deptTree = await BuildDepartmentTree(sdk.DbContext);
// 写入缓存,30分钟过期
await sdk.CacheHelper.CacheSetAsync(cacheKey, deptTree, TimeSpan.FromMinutes(30));
}
return deptTree;
}
缓存配置数据
// 缓存系统配置,减少重复读取
var config = await sdk.CacheHelper.CacheGetAsync<AppConfig>("system:config");
if (config == null)
{
config = LoadConfigFromDb();
await sdk.CacheHelper.CacheSetAsync("system:config", config, TimeSpan.FromHours(1));
}
注意事项
- 缓存的底层实现由
Instance属性决定(Memory或Redis) - 生产环境建议使用 Redis 以支持分布式缓存
- 设置合理的过期时间避免内存泄漏和数据陈旧
- 缓存 Key 建议使用命名空间前缀(如
user:、app:)避免冲突