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产品图添加背景
相关推荐
Smoothcloud润云1 小时前
PyTorch大模型权重加载与启动耗时优化实战:定位磁盘、内存与显存瓶颈databook1 小时前
从循环到向量化:NumPy提速的7个关键思维唠点键盘之外的1 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)云和恩墨1 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环ly76892 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界棉猴2 小时前
玩游戏学Python1-Python和pgzero库的安装豆角焖肉2 小时前
Spring AOP 自定义注解实现系统操作日志诺伦2 小时前
GEO优化数据实证:78%引用流向官网的机制拆解与小品牌三步管线实战教程 | RiseClaw玄策oooost2 小时前
pytorch学习笔记1数字融合3 小时前
透明化视频孪生虚实映射一体化融合技术