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;
     });
 }
相关推荐
IvorySQL9 小时前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
曹牧9 小时前
C#:未被引用的函数
c#
刘胡子大叔9 小时前
SQL 脚本的导入顺序
数据库·sql
代码什么用10 小时前
Spring对IoC的实现
数据库·spring
禾小西11 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
hz5678912 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC12 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday12 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
半杯咖啡半行码12 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
小米里的大麦12 小时前
16 MySQL 事务
数据库·mysql