C# 结合Redis Cache 访问MySQL数据库

简介:

该代码实现了一个异步方法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;
     });
 }
相关推荐
Flynt10 小时前
Room 3.0 包名重构 + KMP 迁移:我把项目升级踩了个遍
android·数据库·kotlin
晚安code11 小时前
缓存击穿、穿透、雪崩一次讲透:附 Redis hotkey 实战
redis
wear工程师11 小时前
Redis 分布式锁到底靠不靠谱:从 SETNX 到 Redlock,我踩过的坑和业内的争议
redis·面试
这个DBA有点耶1 天前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶1 天前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技1 天前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend1 天前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence1 天前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说2 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils2 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端