RedisCacheProviderPlaceholder
约 617 字大约 2 分钟
2026-05-23
概述 (Overview)
RedisCacheProviderPlaceholder 是 UniCon 框架在未集成正式 Redis 缓存时提供的占位实现,满足 IUniconCacheProvider 接口的编译要求。其内部基于 ConcurrentDictionary 提供线程安全的本地内存存储,与内置的 MemoryCacheProvider 功能相同,不提供真正的分布式缓存能力。
其主要用途是:在尚未引用 Redis 相关库时,作为过渡期占位,保持代码编译通过,后续平滑替换为真实 Redis 实现。
注意:框架已通过
AddUniCon()默认注册了MemoryCacheProvider。若无分布式缓存需求,直接使用AddUniCon()即可,无需引用本占位实现。
使用方法 (Usage)
在依赖注入阶段手动替换缓存提供者:
var builder = WebApplication.CreateBuilder(args);
// 方式一:使用内置 MemoryCacheProvider(包含在 AddUniCon() 中,无需额外注册)
builder.Services.AddUniCon();
// 方式二:手动注册 RedisCacheProviderPlaceholder(替换占位实现)
// 注意:这会覆盖 AddUniCon() 中注册的 MemoryCacheProvider
builder.Services.AddSingleton<IUniconCacheProvider, RedisCacheProviderPlaceholder>();参数说明 (Parameters)
RedisCacheProviderPlaceholder 本身不接受外部配置参数,所有行为通过内部 ConcurrentDictionary 实现。
| 参数名 | 类型 | 说明 | 是否必填 | 默认值 |
|---|---|---|---|---|
| — | — | 无配置参数 | — | — |
返回值 (Returns)
| 接口方法 | 返回类型 | 说明 |
|---|---|---|
GetAsync | Task<DataValue<object>?> | 返回缓存中的最新数据值,不存在时返回 null |
SetAsync | Task | 将数据值写入缓存 |
RemoveAsync | Task | 从缓存中删除指定条目 |
使用示例 (Examples)
示例 1:接入真实 Redis 的推荐迁移路径
当项目准备接入 Redis 时,实现 IUniconCacheProvider 并注册替换即可,无需修改任何业务代码:
using StackExchange.Redis;
using System.Text.Json;
using UniCon.Core.Caching;
using UniCon.Core.Models;
public class RedisCacheProvider : IUniconCacheProvider
{
private readonly IDatabase _db;
public RedisCacheProvider(IConnectionMultiplexer redis)
=> _db = redis.GetDatabase();
public async Task<DataValue<object>?> GetAsync(string driverId, string address, CancellationToken ct = default)
{
var json = await _db.StringGetAsync($"unicon:{driverId}:{address}");
return json.HasValue
? JsonSerializer.Deserialize<DataValue<object>>(json!)
: null;
}
public async Task SetAsync(string driverId, string address, DataValue<object> dataValue, CancellationToken ct = default)
{
var json = JsonSerializer.Serialize(dataValue);
await _db.StringSetAsync($"unicon:{driverId}:{address}", json, TimeSpan.FromMinutes(10));
}
public async Task RemoveAsync(string driverId, string address, CancellationToken ct = default)
=> await _db.KeyDeleteAsync($"unicon:{driverId}:{address}");
}在 Program.cs 中替换注册:
// 注册 Redis 连接
builder.Services.AddSingleton<IConnectionMultiplexer>(
ConnectionMultiplexer.Connect("localhost:6379"));
// 替换内置 MemoryCacheProvider(必须在 AddUniCon() 之后调用以覆盖)
builder.Services.AddUniCon();
builder.Services.AddSingleton<IUniconCacheProvider, RedisCacheProvider>();示例 2:通过接口使用缓存(业务层无感知切换)
public class CacheQueryService
{
private readonly IUniconCacheProvider _cacheProvider;
public CacheQueryService(IUniconCacheProvider cacheProvider)
{
_cacheProvider = cacheProvider;
}
public async Task<DataValue<object>?> GetCachedValueAsync(string driverId, string address)
{
return await _cacheProvider.GetAsync(driverId, address);
}
}更新记录:修正文档中不存在的
AddRedisCacheProviderPlaceholder()扩展方法描述,明确占位实现的使用场景与 Redis 迁移路径。
