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;
     });
 }
相关推荐
Full Stack Developme1 天前
数据库索引的原理及类型和应用场景
数据库
IDC02_FEIYA1 天前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录1 天前
MySQL面试题——联合索引
数据库·面试
萧曵 丶1 天前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网1 天前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
毕设十刻1 天前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
ohoy1 天前
RedisTemplate 使用之Zset
java·开发语言·redis
椒颜皮皮虾1 天前
TensorRtSharp:在 C# 世界中释放 GPU 推理的极致性能
c#·tensorrt
行止951 天前
WinForms 彻底隐藏 滚动条的终极解决方案
c#
bugcome_com1 天前
WPF样式进阶实战:外置样式+MVVM主题切换+样式优先级全解析
c#·.net·wpf