C# 结合Redis Cache 访问MySQL数据库
简介:
该代码实现了一个异步方法GetLocalTimersByDeviceIdAsync,用于根据设备ID获取本地定时器。
方法首先检查系统配置是否启用缓存功能,若未启用则直接从数据库查询。
若启用缓存,则优先从Redis缓存获取数据,若缓存未命中则查询数据库并将结果缓存:有效数据缓存1天,空数据缓存5分钟。
查询数据库时使用EF Core进行条件筛选并映射到LocalTimer实体类。
代码
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;});}
