Skip to main content

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:)避免冲突