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;
     });
 }
相关推荐
栗子~~6 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星星也在雾里7 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
雨辰AI9 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20249 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有9 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Xin_ye100869 小时前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#
rockey62710 小时前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
Mr. zhihao10 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_7488394910 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录10 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能