ASP.NET Core 6+ 应使用 Microsoft.Extensions.Caching.StackExchangeRedis 封装的 IDistributedCache,而非直连 StackExchange.Redis;需显式序列化、设过期时间、防穿透/击穿/雪崩,并用 redis-stack-server 本地开发。ASP.NET Core 6+ 默认用 IDistributedCache 接 Redis,别自己封装 StackExchange.Redis 客户端直接暴露 ConnectionMultiplexer 容易导致连接泄漏、序列化不一致、超时配置错乱。微软的 Microsoft.Extensions.Caching.StackExchangeRedis 包已封装好线程安全、连接复用和异常重试逻辑,且与 ILogger、IOptions 深度集成。常见错误现象:Timeout performing GET 频发、缓存键大小写不一致导致命中失败、JSON序列化后类型丢失。注册时必须用 AddStackExchangeRedisCache,而非手动 AddSingleton<IConnectionMultiplexer>连接字符串里不要硬编码 connectTimeout=5000 ------ 它会被 ConfigurationOptions.ConnectTimeout 覆盖,而后者默认是 5s,生产环境建议设为 10--15s避免在 Startup.ConfigureServices 中调用 GetDatabase() 获取实例 ------ 这会提前触发连接,且破坏 DI 生命周期管理IDistributedCache.SetAsync 存的是字节数组,不是对象,别漏了序列化它底层不做任何序列化,传入 new byte\[\] { 1, 2, 3 } 就存什么,取出来也一样。如果你直接传 JsonSerializer.SerializeToUtf8Bytes(obj),那读取时就得对应 JsonSerializer.Deserialize<T>(bytes),否则就是 NullReferenceException 或 JSON 解析失败。使用场景:存 DTO、配置片段、计算结果等短生命周期数据;不适合存大文件或未压缩的二进制流(Redis 单 key 建议 ≤ 1MB)。推荐统一用 System.Text.Json,避免 Newtonsoft.Json 引入额外依赖和兼容性问题设置过期时间必须显式传 new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(10)),不传就永不过期注意 SetAsync 不会自动处理 null 值 ------ 传 null 会存空字节数组,读出来也是非 null 的空数组,业务层要主动判空Redis 缓存穿透、击穿、雪崩,在 C# 层能做的只有"缓存空值 + 逻辑过期"Redis 本身不解决这三类问题,得靠代码逻辑兜底。比如查数据库返回 null,你不能跳过缓存直接返回,而应把 "" 或特殊标记(如 {"exists":false})连同短 TTL(如 2 分钟)一起写入缓存。 Mokker AI AI产品图添加背景
相关推荐
卷无止境9 分钟前
FastAPI 前端托管全攻略:从静态文件到大型全栈项目架构雨晨源码(同名B站)22 分钟前
基于深度学习YoloV11农业病害虫害检测系统 智慧农业信息化综合管理平台 (附源码+lw文档+ppt)QQ54164512132 分钟前
【驿帮查件助手python开源】开源聚合查件机器人,实现 24 类驿站批量查件取代短信通知。技术方案分享卷无止境36 分钟前
当FastAPI项目开始"膨胀",代码该往哪儿放用户8356290780511 小时前
Python设置PowerPoint幻灯片背景的方法wang_yb1 小时前
Python 中 10 个最常用的统计函数databook1 小时前
Python 中 10 个最常用的统计函数DBA小马哥1 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语云和数据.ChenGuang1 小时前
fastapi项目拆分实战数据模型祈禾1 小时前
Redis三大特殊数据类型