通过合理的缓存管理,可以有效提升系统性能并降低数据库访问压力。
1. 缓存配置
缓存配置采用 JSON 格式定义,支持 Memory 和 Redis 两种缓存类型。
Redis 配置示例:
1 2 3 4 5 6 7 8 9 10 11
| { "CacheConfig": { "type": "Redis", "redis": { "connectionString": "127.0.0.1:6379,password=pwd,defaultDatabase=0" } } }
|
| 参数 |
说明 |
type |
缓存类型,支持Memory(内存缓存)和 Redis(分布式缓存) |
redis.connectionString |
Redis 连接字符串,包含主机地址、端口、密码和默认数据库等信息 |
2. 缓存键定义
缓存键用于唯一标识缓存数据。建议将缓存键定义为常量,并提供辅助方法以统一键的生成规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public static partial class CacheKeys { [Description("模块缓存键")] public const string ModuleActionKey = "module:action:";
public static string GetModuleActionKey(long id) => $"{ModuleActionKey}{id}"; }
|
缓存键命名规范:
- 采用冒号分隔的层级结构,如
{entity}:{action}:{id}
- 统一使用常量定义,便于维护和避免硬编码
ICacheTool 接口提供通用的缓存操作方法,包括:
| 方法 |
说明 |
GetAsync<T> |
根据键获取缓存值 |
SetAsync |
设置缓存,支持过期时间 |
DelAsync |
删除指定键的缓存 |
ExistsAsync |
判断键是否存在 |
KeysAsync |
批量获取匹配的键 |
4. 缓存使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
[Order(1010)] [DynamicApi(Area = ApiConsts.AreaName)] public class ModuleService : IDynamicApi { private readonly AppRepositoryBase<ModuleEntity> _moduleRep; private readonly ICacheTool _cache;
public ModuleService(AppRepositoryBase<ModuleEntity> moduleRep, ICacheTool cache) { _moduleRep = moduleRep; _cache = cache; }
public async Task<ModuleGetOutput> GetAsync(long id) { var cacheKey = CacheKeys.GetModuleActionKey(id);
var module = await _cache.GetAsync<ModuleGetOutput>(cacheKey); if (module == null) { module = await _moduleRep.GetAsync<ModuleGetOutput>(id); await _cache.SetAsync(cacheKey, module, TimeSpan.FromMinutes(5)); }
return module; }
public async Task UpdateAsync(ModuleUpdateInput input) { var entity = await _moduleRep.GetAsync(input.Id); if (entity?.Id is not > 0) throw ResultOutput.Exception("模块不存在");
Mapper.Map(input, entity); await _moduleRep.UpdateAsync(entity);
var cacheKey = CacheKeys.GetModuleActionKey(input.Id); await _cache.SetAsync(cacheKey, Mapper.Map<ModuleGetOutput>(entity), TimeSpan.FromMinutes(5)); }
public async Task DeleteAsync(long id) { await _moduleRep.DeleteAsync(m => m.Id == id);
var cacheKey = CacheKeys.GetModuleActionKey(id); await _cache.DelAsync(cacheKey); } }
|
缓存策略说明
| 操作 |
缓存行为 |
| 查询(GetAsync) |
缓存优先,miss 时回源数据库并回填缓存 |
| 修改(UpdateAsync) |
先更新数据库,再同步更新缓存 |
| 删除(DeleteAsync) |
先删除数据库记录,再删除缓存 |
优势
- 性能提升:减少数据库访问频率,加快查询响应
- 数据一致性:修改/删除时同步更新缓存,避免脏读
- 灵活过期:通过设置 TTL 避免缓存数据过期
适用场景
- 频繁读取但较少更新的数据(如模块配置、字典项)
- 对查询响应时间要求较高的业务场景
- 需承受一定数据延迟的业务场景
#缓存管理 #中台/配置文件 #中台/公共帮助类 #Redis #Memory