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产品图添加背景
相关推荐
默_笙1 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的qq_426003961 天前
启动playwright录制codegen生成自动化测试脚本虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺长沙三为智能科技1 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南只睡四小时1 天前
Canvas 弹道联机实战:700 行 + 固定时间步长