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;
     });
 }
相关推荐
IvorySQL3 小时前
为IvorySQL增添PACKAGE语法帮助
数据库·postgresql
哈皮Superman3 小时前
【Research】MagicFuzzer: Scalable deadlock detection for large-scale applications
java·开发语言·数据库
自由会客室3 小时前
Ubuntu 24.04上安装MySQL 8.0
数据库·mysql
yi碗汤园3 小时前
【一文了解】八大排序-冒泡排序、选择排序
开发语言·前端·算法·unity·c#·1024程序员节
李少兄5 小时前
记一次 Spring Boot 项目中 Redis 工具类的重构实践
spring boot·redis·重构
姚远Oracle ACE5 小时前
如何判断Oracle AWR报告中的SQL在多大程度能代表整个系统的负载?
数据库·oracle·1024程序员节
chushiyunen5 小时前
neo4j图数据库笔记
数据库·笔记·neo4j
一 乐5 小时前
宠物管理|宠物店管理|基于SSM+vue的宠物店管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·宠物
c#上位机6 小时前
wpf之数据类型转换
c#·wpf·mvvm