
Dorisoy.Pan Redis 并发锁与优雅降级没有 Redis 也能正常运行的秘密【免费下载链接】Dorisoy.PanDorisoy.Pan 是基于 .NET 10 的跨平台文档管理系统使用 MS SQL 2012 / MySQL 8.0或更高版本后端数据库您可以在 Windows、Linux 或 Mac 上运行它。项目中的所有方法都是异步的支持 JWT 令牌身份验证项目体系结构遵循 CQRS MediatR 模式和最佳安全实践。源代码完全可定制热插拔且清晰的体系结构使开发定制功能和遵循任何业务需求变得容易。项目地址: https://gitcode.com/gh_mirrors/do/Dorisoy.Pan在众多开源文档管理系统中Dorisoy.Pan凭借 .NET 10 全异步架构、CQRS MediatR 模式与 JWT 安全认证成为跨平台Windows / Linux / Mac部署的热门选择。很多用户好奇它明明用到了Redis 并发锁为什么断掉 Redis 后系统依然能上传文件、正常运行本文将深入源码为你揭秘Dorisoy.Pan Redis 并发锁与优雅降级的设计智慧让新手也能看懂这套高可用架构的巧妙之处。 一分钟认识 Dorisoy.Pan跨平台文档管理系统Dorisoy.Pan 是一套基于 .NET 10 的跨平台文档管理系统后端支持 MS SQL 2012 / MySQL 8.0所有方法均为异步实现并遵循 CQRS MediatR 最佳实践。它提供了文件上传、文件夹管理、版本控制、共享链接、权限管理等企业级功能代码结构清晰、热插拔易定制非常适合作为二次开发的基础框架。 Redis 在 Dorisoy.Pan 里到底干什么在深入了解降级机制前先要搞清楚Dorisoy.Pan 使用 Redis 的核心场景并发上传去重。当你上传大文件时系统会按 MD5 分片上传。设想这样的场景——你和同事同时把一个内容完全相同的大文件拖进系统如果不加控制两人会各自写入分片、各自落库产生大量重复磁盘写入Dorisoy.Pan 的做法是用MD5 作为 Redis 键把正在上传该文件的用户 ID 追加到 Redis 列表中从而识别谁在并发上传同一文件。这个逻辑集中在 UploadDocumentCommandHandler.cs 中Redis 客户端通过INewLifeRedis接口注入NuGet 包为NewLife.Redis。 并发锁的精妙设计只在真正并发时才加锁很多系统的锁是无脑加锁而Dorisoy.Pan 的 Redis 并发锁更聪明——按需加锁。核心方法是CanLock(md5)它先检查 Redis 中是否存在该文件的键再判断列表里是否有1 个以上用户正在上传。只有当检测到多人同时上传同一文件时才返回 true 触发加锁if (!_redis.ContainsKey(md5)) return false; return _redis.ListGetAllGuid(md5).Count 1;加锁后写分片和合并文件分别使用lock (Writing)、lock (Combining)两把独立的锁做双重防护并且对IOException如 another process做了静默容忍处理避免并发写盘冲突导致上传中断。这种先探测、后加锁的设计让单用户上传几乎零锁开销性能极佳。️ 优雅降级的秘密每个 Redis 调用都有兜底现在揭晓本文标题的答案——为什么没有 Redis 也能正常运行秘诀就藏在源码的每一个try-catch里。在CanLock、SetCache、RemoveCache三个方法中所有 Redis 操作都被 try-catch 包裹catch (Exception ex) { _logger.LogWarning(ex, Redis unavailable in CanLock, falling back to no-lock mode.); return false; // 降级不加锁直接继续 }这意味着Redis 挂掉时CanLock返回 false系统自动进入无锁模式上传照常进行写缓存失败时仅记录Redis unavailable, skipping cache警告不会中断业务流程并发去重检查失败时跳过检查走正常上传流程最多造成少量重复写入绝不崩溃。这就是**优雅降级Graceful Degradation**的核心思想Redis 是增强项而非必需品缓存可用时享受并发保护缓存不可用时保证服务可用。日志中还保留Logger告警方便运维第一时间发现 Redis 异常真正做到故障不致命、问题可观测。️ 一次上传请求的完整旅程把上面几块拼起来一次带 Redis 的上传流程是这样的前端按 MD5 分片上传服务端校验可执行文件等安全规则检查是否已有相同 MD5 的文件记录首次上传则继续SetCache把当前用户加入该 MD5 的 Redis 列表标记正在上传CanLock探测并发人数超过 1 人则用lock串行写入分片最后一个分片到达时CombinFile合并加密文件、落库、生成缩略图RemoveCache清理 Redis 键一次并发安全的上传完成。Dorisoy.Pan 文件管理与上传界面.png)如果你正在观察系统行为可以重点关注Startup.cs中的一行注册代码——services.AddNewLifeRedis()它就是整个 Redis 能力的开关也印证了依赖注入带来的可替换性。⚙️ 动手体验克隆项目与快速部署想亲自验证拔掉 Redis 系统仍能跑按以下步骤即可git clone https://gitcode.com/gh_mirrors/do/Dorisoy.Pan克隆后进入Web目录用 Visual Studio 或dotnet run启动Dorisoy.Pan.API配置好 MySQL 连接字符串然后直接停掉 Redis 服务再上传文件——你会发现系统依旧稳定运行只是日志里多了几条优雅的降级警告。整个架构的源码文件索引如下Redis 注册入口Startup.cs并发锁与降级核心逻辑UploadDocumentCommandHandler.csRedis 依赖声明Dorisoy.Pan.MediatR.csproj 写在最后这套设计给我们的启发Dorisoy.Pan 的 Redis 并发锁与优雅降级方案给所有开发者上了一堂生动的高可用设计课外部依赖应当锦上添花而非生死攸关。通过按需加锁降低性能损耗、通过 try-catch 兜底保证核心链路、通过日志告警实现故障可观测——三个朴素的手段组合在一起就让系统获得了堪比专业中间件的韧性。无论你是想学习 .NET 架构还是打算二次开发一套文档管理系统这份源码都值得仔细研读。【免费下载链接】Dorisoy.PanDorisoy.Pan 是基于 .NET 10 的跨平台文档管理系统使用 MS SQL 2012 / MySQL 8.0或更高版本后端数据库您可以在 Windows、Linux 或 Mac 上运行它。项目中的所有方法都是异步的支持 JWT 令牌身份验证项目体系结构遵循 CQRS MediatR 模式和最佳安全实践。源代码完全可定制热插拔且清晰的体系结构使开发定制功能和遵循任何业务需求变得容易。项目地址: https://gitcode.com/gh_mirrors/do/Dorisoy.Pan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考