简介:
该代码实现了一个异步方法GetLocalTimersByDeviceIdAsync,用于根据设备ID获取本地定时器。
方法首先检查系统配置是否启用缓存功能,若未启用则直接从数据库查询。
若启用缓存,则优先从Redis缓存获取数据,若缓存未命中则查询数据库并将结果缓存:有效数据缓存1天,空数据缓存5分钟。
查询数据库时使用EF Core进行条件筛选并映射到LocalTimer实体类。
代码
csharp
public static async Task<List<LocalTimer>?> GetLocalTimersByDeviceIdAsync(string deviceId)
{
// 定义一个从数据库中获取数据的方法
async Task<List<LocalTimer>?> GetDataFromDB()
{
return await DbExecuter.ExecuteAsync(async db =>
{
return await db.LocalTimers
.Where(d => d.DeviceId == deviceId)
.Select(d => new LocalTimer
{
LocalTimerId = d.LocalTimerId,
DeviceId = d.DeviceId,
UserId = d.UserId,
TimerIndex = d.TimerIndex,
Description = d.Description,
Enabled = d.Enabled,
ExecuteTime = d.ExecuteTime,
IsTurnOn = d.IsTurnOn,
Frequency = d.Frequency,
WeeklyCustom = d.WeeklyCustom,
CreatedAt = d.CreatedAt,
UpdatedAt = d.UpdatedAt
}).ToListAsync();
});
}
// 检查系统配置,是否优先从缓存中取数据
if (DbCache.IsFunctionCached() == false)
{
//直接都数据库
return await GetDataFromDB();
}
// 从缓存中取数据
return await RedisExecutor.ExecuteAsync(async redis =>
{
var cacheKey = Key_LocalTimers_By_DeviceId + deviceId;
var value = await redis.GetAsync<List<LocalTimer>>(cacheKey);
// 缓存中没有,都数据库,并添加缓存
if (value == null || value.Count == 0)
{
value = await GetDataFromDB();
await redis.SetAsync(cacheKey,
(value != null && value.Count > 0) ? value : null,
(value != null && value.Count > 0) ? TimeSpan.FromDays(1) : TimeSpan.FromMinutes(5));
}
return value;
});
}