自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(188)
  • 收藏
  • 关注

原创 缓存 --- Redis缓存的一致性

策略核心优点核心缺点脏数据类型推荐指数适用场景先更新数据库,再更新缓存无明显优点无效写多,性能浪费;并发易出现写覆盖永久性/临时性⭐无任何推荐场景先更新缓存,再更新数据库无明显优点数据库更新失败会导致幽灵数据;无效写问题永久性⭐无任何推荐场景先删除缓存,再更新数据库逻辑简单,实现成本低高并发下极易产生脏数据;无自动修正机制永久性⭐⭐低并发、对一致性要求极低的非核心业务(如日志统计)先更新数据库,再删除缓存安全性高,性能友好;实现简单。

2026-01-18 16:27:12 1222

原创 系统设计 --- 使用Pipeline模式解决面向过程编程

本文介绍如何使用Pipeline模式解决面向过程编程中的代码冗长问题。通过定义核心接口IStep和4个具体步骤接口,实现步骤类的链式调用,最后通过Pipeline类驱动整个流程执行。该方案采用分层架构设计,结合依赖注入实现步骤实例的管理,有效解决了函数嵌套带来的可维护性问题,使代码结构更清晰、易于扩展。

2026-01-13 17:27:33 841

原创 分布式系统开发核心问题总结

核心痛点:跨服务、跨数据库的操作无法借助单机事务保障原子性;强一致方案存在性能差、易阻塞的问题,而最终一致方案则面临开发成本高的难题。核心痛点:分片键设计不当易导致数据倾斜;跨分片查询逻辑复杂,容易出现查询错误;集群扩容过程中的数据迁移操作易引发性能波动。核心痛点:缓存与数据库之间的同步存在延迟,易引发脏读、数据不一致等问题;同时还面临缓存穿透、缓存击穿、缓存雪崩等典型风险。核心痛点:消息传输与处理过程中易出现丢失、重复消费、顺序错乱等问题,这些问题会直接导致分布式系统中的数据不一致。

2026-01-06 22:05:44 342

原创 系统设计 --- 使用消息队列解决分布式事务

传统的本地事务(如单数据库事务)依托数据库自身能力就能满足ACID特性,但在分布式系统中,操作往往涉及多个独立节点——可能是不同服务的数据库、不同的服务实例,甚至是消息队列等中间件。这种跨节点的一系列操作所构成的事务,就是分布式事务。核心要求不变:仍需严格遵守原子性、一致性、隔离性、持久性(ACID),简单来说,就是“要么全成,要么全败”,绝对不允许出现部分操作成功、部分失败的中间状态,否则会导致数据错乱,影响业务正常运行。

2026-01-06 21:46:09 995

原创 系统设计 --- 分布式系统Bug定位指南

分布式系统Bug定位指南 本文针对分布式系统复杂环境下的故障排查,提出了一套系统化方法。首先强调复现性判断的重要性,区分稳定复现和偶发问题的不同排查路径。核心解决方案是引入CorrelationId实现全链路追踪,通过全局唯一ID串联各服务日志,快速定位故障源。文章还提供了状态码分析框架和四项进阶技巧:日志标准化、全链路压测、灰度发布和中间件监控强化。最终形成"缩小范围→精准突破"的排查逻辑,强调完善的监控体系和规范开发流程对快速定位故障的关键作用,帮助开发者高效解决分布式环境下的各类问

2026-01-04 21:58:33 796

原创 Web系统设计 --- HTTP + GraphQL

// 书籍实体/// 书籍IDset;/// 书名set;/// 作者ID(关联字段)set;/// 关联作者(支持嵌套查询)set;/// 作者实体/// 作者IDset;/// 作者姓名set;/// 作者年龄set;/// 作者的书籍列表(支持嵌套查询)set;} = new();GraphQL 以其“按需查询”“单一端点”的特性,为多端适配、复杂数据查询场景提供了更优的解决方案。

2026-01-04 19:45:32 1186

原创 Web系统设计 --- 接口防抖

本文介绍了Web系统设计中接口防抖的实现方案。防抖通过延迟执行和重置机制减少重复请求,需前后端协同实现。前端通过定时器控制请求时机,支持手动取消功能,适用于按钮点击和搜索场景;后端基于请求标识和时间窗口记录,采用中间件统一拦截重复请求。文章提供了JavaScript和C#的代码示例,并指出需根据场景调整延迟时间,避免过度防抖影响用户体验。前后端结合可有效优化性能并保障系统稳定性。

2026-01-04 19:23:05 920

原创 C# --- Stream

C# Stream 摘要 Stream是C#中处理字节数据传输的抽象基类,提供统一的IO操作接口。核心特点包括:字节导向(最小单位byte)、可定位性(支持随机/顺序访问)、可读写性和资源释放机制。常用子类包括: MemoryStream:内存数据操作,速度快 FileStream:文件系统读写,需释放资源 NetworkStream:网络通信,仅顺序访问 BufferedStream:通过缓冲区优化IO性能 CryptoStream:数据加密/解密 Stream通过抽象设计实现了不同数据源的一致操作方式,

2026-01-03 23:58:21 767 1

原创 Web框架 --- .NET中的Options Pattern

摘要: .NET Options Pattern 是一种强类型配置管理模式,通过将配置文件(如 appsettings.json)映射到 POCO 类,实现编译期校验和依赖注入。核心优势包括类型安全、DI 支持、配置验证和变更监听。使用步骤:1) 定义配置节点;2) 创建对应 Options 类;3) 通过 Configure<TOptions> 绑定配置并注册服务;4) 通过 IOptions<T> 等接口注入使用。适用于数据库连接、API 配置等场景,提升可维护性和可靠性。

2026-01-03 23:19:37 895

原创 微服务治理 --- 核心维度及常用技术栈组件

微服务治理是覆盖服务全生命周期的管控体系,核心目标是保障微服务架构稳定、高效、可扩展运行。云原生生态以Kubernetes(K8s)为核心基础设施,搭配服务网格、高性能网关等组件,实现治理能力与业务代码解耦,支持多语言服务,适合大规模、高可用的企业级微服务集群。Spring Cloud是基于Spring Boot的微服务开发工具集,通过封装开源组件实现治理能力,组件间兼容性强、学习成本低,适合中小型Java微服务项目快速落地。

2026-01-03 22:27:50 993

原创 git --- reset 删除提交

摘要:本文介绍使用Git删除提交的几种方法。对于最近提交,可用git reset:--soft保留修改,--mixed清空暂存区,--hard彻底丢弃修改(危险)。删除中间提交需用git rebase -i交互式变基,找到目标提交并改为drop。若已推送到远程仓库,需先删除本地提交,再用git push -f或更安全的--force-with-lease强制推送覆盖远程历史。注意:删除远程提交会改写历史,需谨慎操作。

2025-12-28 01:06:03 397

原创 git --- git rebase -i 重新编写提交历史

git rebase -i(Interactive Rebase)是 Git 的“时光机”和“手术刀”。它允许你重新编写提交历史,让 Commit Log 变得整洁、专业。核心指令:编辑器里的“手术刀”Git 变基的底层执行流程。

2025-12-28 00:52:28 1168

原创 前端 --- Flex布局

Flex布局是一种CSS弹性盒子模型,专为一维布局设计,通过设置容器属性控制子元素排列。主要包含两种元素:容器(设置display: flex)和项目(容器直接子元素)。布局涉及主轴和交叉轴,默认主轴为水平方向。常用属性包括:flex-direction(定义排列方向)、justify-content(主轴对齐方式)、align-items(交叉轴单行对齐)、align-content(多行分布)和flex-wrap(换行控制)。典型应用场景包括响应式导航栏、卡片布局和侧边栏+内容区结构,通过flexGro

2025-12-09 23:04:41 1040

原创 Web框架 --- .NET中的Worker Service

摘要:本文介绍了.NET中实现后台任务的两种方式:IHostedService接口和BackgroundService抽象类。IHostedService需实现StartAsync和StopAsync方法,而BackgroundService作为其子类简化了实现,只需重写ExecuteAsync方法。文章通过定时任务示例展示了两种实现方式,并说明通过AddHostedService注册服务。BackgroundService特别适合需要长时间运行的任务,其执行顺序与注册顺序一致。

2025-12-02 23:30:09 359

原创 C# --- 如何写UT

本文介绍了C#中单元测试(UT)的两种场景:简单类和依赖注入类。对于无依赖的简单类,直接实例化并测试输入输出即可。对于依赖外部服务的类,通过Moq框架模拟接口行为,隔离外部依赖进行测试。文章提供了代码示例,展示了如何使用MSTest进行断言验证,并说明了Moq的核心功能如返回值控制、调用验证等。单元测试可提高代码质量,降低维护成本。

2025-11-21 17:20:38 1079

原创 系统设计 --- 多节点中按顺序处理消息

本文探讨了多节点系统中顺序处理消息的设计方案。针对Service A和B各20个实例的场景,提出两种解决方案:1)手动设置routing key,通过对实例编号实现相同Object的消息由固定节点处理;2)使用RabbitMQ的一致性哈希交换器(Consistent Hashing Exchange)实现负载均衡。方案对比显示,两种方法都能保证消息顺序处理,但实现机制不同。该设计解决了分布式系统中消息顺序处理的挑战,同时兼顾了系统扩展性。

2025-11-10 00:08:18 409

原创 k8s --- resource: StatefulSet

StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载 API 对象。它为每个 Pod 提供唯一的、稳定的标识符和专用的持久化存储,从而保证了 Pod 的部署、扩缩容和删除都是有序且可预测的。

2025-11-09 18:26:34 1235

原创 k8s --- resource: Pod, ReplicaSet and Deployment

Kubernetes资源对象Pod、ReplicaSet和Deployment分别对应不同的管理层次。Pod是最小部署单元,运行具体容器但生命周期短暂;ReplicaSet负责维持指定数量的Pod副本,确保高可用性;Deployment作为最常用的无状态应用管理对象,通过控制ReplicaSet来实现滚动更新、回滚等高级功能。典型工作流程中,用户通过Deployment创建应用,由Deployment生成ReplicaSet,再由ReplicaSet维护指定数量的Pod实例,形成一个三层管理架构,共同保障应

2025-11-04 19:05:51 928

原创 k8s --- resource

Kubernetes资源概述 Kubernetes中的资源是API端点,用于存储和管理集群中的各种对象。资源可分为三大类:工作负载资源(如Pod、Deployment)、服务发现资源(如Service、Ingress)和配置存储资源(如ConfigMap、PV)。每个资源通过YAML/JSON文件定义,包含apiVersion、kind、metadata等字段。控制器作为资源执行者,负责监控和维护资源状态,确保实际状态与期望状态一致。主动资源(如Deployment)由控制器管理,而被动资源(如Config

2025-11-04 18:37:15 1095

原创 k8s --- Intro

Kubernetes(K8s)是解决微服务管理和容器化部署问题的分布式架构方案。其核心架构分为控制平面和工作节点:控制平面(包括API Server、etcd、调度器等)作为集群大脑进行全局决策,工作节点(包含kubelet、kube-proxy等)负责执行具体任务。K8s通过统一接口管理大量容器化微服务,实现自动化部署、资源调度和故障恢复,解决了微服务架构带来的服务管理复杂性问题,成为当前容器编排的事实标准。其工作流程通过各组件协同,确保应用按预期状态运行。

2025-11-03 18:07:35 791

原创 Web系统设计 --- 身份认证之OAuth授权机制

OAuth是一种开放授权标准,用于安全地允许第三方应用在用户授权下访问其资源,而无需共享密码。它解决了传统密码共享方式的安全隐患,如密码泄露、权限过大等问题。OAuth 2.0提供两种主要授权模式:授权码模式通过后端服务器交换令牌,安全性高;简化模式直接在浏览器获取令牌,但存在安全风险。典型应用场景包括社交登录、API访问控制等。OAuth的工作流程涉及用户、客户端、授权服务器和资源服务器之间的交互,确保授权过程安全可控。随着网络安全要求提高,授权码模式配合PKCE正逐渐取代简化模式。

2025-10-28 17:46:51 789

原创 C# --- 使用定时任务实现日志的定时聚合

本文介绍了使用C#定时任务实现日志聚合的方案。通过IOperationTracker接口定义日志记录功能,核心实现类OperationTracker利用ConcurrentDictionary缓存日志数据,并使用Timer每10分钟触发一次FlushMetricsData方法将聚合后的日志输出。方案包含初始化定时器、记录操作指标(含用户信息、资源使用量等)、缓存聚合数据等功能模块,最后通过依赖注入方式在应用启动时初始化监控服务。该方案有效减少了日志数量,同时保留了关键监控指标。

2025-09-15 15:49:26 386

原创 C# --- dispose机制与using关键字

摘要: C#的Dispose机制通过IDisposable接口管理非托管资源(如文件句柄、数据库连接等),确保资源及时释放。核心是Dispose()方法,通常配合using语句自动调用。标准实现包括Dispose(bool disposing)方法区分主动释放与GC终结,并需注意避免常见错误如忘记调用Dispose、终结器中操作托管对象等。using语法糖会被编译为try-finally块,保证资源释放的可靠性。完整模式需包含终结器作为安全网,并通过GC.SuppressFinalize优化性能。

2025-09-14 22:04:38 1164

原创 C# --- Field and Property

本文介绍了C#中字段(Field)与属性(Property)的区别与使用场景。字段是直接存储数据的私有变量,通常应设为private以保证封装性。属性则是对字段访问的控制器,通过get/set方法提供数据验证、计算等功能,并支持多种声明方式。文章详细讲解了完整的属性声明、自动属性、只读属性、表达式主体属性等不同形式,以及C#各版本引入的新特性。最后提醒了单例类中属性错误初始化可能导致线程泄漏的问题,强调应根据实际需求选择合适的属性声明方式以实现数据安全访问。

2025-09-14 18:25:44 748

原创 C# --- 本地缓存失效形成缓存击穿触发限流

摘要:本文描述了C#中本地缓存失效导致缓存击穿的问题。当接口并发请求外部API时,由于缓存过期导致大量重复请求(QPS约300),触发外部服务429限流。解决方案提出两种方法:1)缓存请求Task避免重复发送相同请求;2)使用信号量控制并发请求数量。文中提供了优化后的代码示例,通过二级缓存机制(缓存结果和请求Task)来缓解缓存击穿问题,并建议参考信号量实现方案进一步限制并发量。

2025-08-05 23:41:54 446

原创 C# --- 使用Redis分布式锁实现初始化任务

本文介绍了使用Redis分布式锁实现多实例服务初始化任务的方案。当多个Service A实例同时启动时,通过获取Redis分布式锁确保只有一个实例执行初始化任务。核心思路是:1) 使用程序集版本号作为标识;2)获取锁的实例比较当前版本与数据库版本,不一致则执行初始化并更新版本;3)其他实例获取锁后若版本一致则跳过初始化。文中提供了C#代码示例,展示了通过RedLockNet库获取锁及初始化流程的实现。该方案有效避免了多实例重复初始化造成的资源浪费。

2025-07-21 17:59:37 524

原创 C# --- 单例类错误初始化导致线程泄漏

被调用时每次都会新建一个Dispatch实例,而Dispatch的构造方法里会创建并运行一个新的线程,也就是说每个requets都会创建一个新的线程。在Dispatch中没有dispose sender, 导致线程没有被释放。经过排查发现了一下问题代码。

2025-07-16 23:17:29 357

原创 系统设计 --- 双重检查锁定

摘要:双重检查锁定(DCL)是一种并发编程技术,通过在加锁前后各检查一次变量状态来优化性能。其核心实现包含两次条件检查:第一次无锁快速检查,第二次加锁后精确检查。典型应用场景包括单例模式延迟初始化(需配合volatile关键字)、连接状态管理以及线程安全缓存实现。这种模式减少了不必要的锁竞争,在保证线程安全的同时提高了程序效率。

2025-07-13 23:29:50 336

原创 Web应用开发 --- Tips

Web应用开发最佳实践摘要:后端需进行参数校验,入库时间应由后端记录。代码风格一致性优于个体正确性,降低团队认知负荷。API修改需保持兼容性,避免破坏性变更。数据库方面,查询字段应加索引,唯一字段需设唯一索引。多线程编程优先使用线程安全工具(如并发集合、TPL),慎用锁机制。控制线程数量,避免资源紧张,可考虑线程池或信号量。异步编程推荐async/await模型。遵循这些原则可提升代码质量、系统性能和可维护性。(149字)

2025-06-29 19:03:09 519

原创 系统设计 --- MongoDB亿级数据查询优化策略

本文探讨了MongoDB处理亿级审计日志数据的解决方案。面对6个月7千万-1亿条数据量、全文检索和时间排序的需求,由于无法使用ELK,采用按周分表策略(每周数据300-400万条)。关键设计包括:时间映射表名、两阶段查询(先统计各collection匹配数再精准获取)、查询结果缓存优化。该方案通过并发查询和智能分页实现了1分钟内响应,满足前端分页、多条件查询和排序需求,将数据库交互控制在2次(统计+查询)。

2025-06-10 20:54:51 915

原创 提示词指南 --- 提示词的基本结构

提示词指南:结构与角色解析》摘要提示词(Prompt)是与AI交互的关键指令,包含角色设定和具体任务要求。基本结构由"role"(角色)和"content"(内容)组成,类似剧本中的导演、演员和观众:System Role(导演):设定AI的行为准则和身份(如"专业法律顾问")User Role(观众):用户提出的具体问题或任务(如"房东不修房子怎么办")Assistant Role(演员):AI根据前两者生成的回答示例显示,当用户要求物理专家用生活案例解释手机发热原理时,AI会给出通俗易懂的

2025-06-05 23:42:38 1616

原创 系统设计 --- 对中台系统进行流量监控和限流

中台系统流量监控与限流策略背景:中台系统需谨慎处理限流问题,避免影响业务系统。监控方案:网关级监控:记录API请求量、来源(x-source-id)和处理时间服务级监控:追踪用户、来源、数据库读写次数及大小(针对Azure Blob)实施方法:使用fluent-bit采集日志存储至AzureDataExplore数据库通过Dashboard展示数据限流策略:分析监控数据业务必需流量:申请硬件扩容

2025-06-03 11:13:09 342

原创 缓存 --- Redis的三种高可用模式

模式主从复制哨兵模式集群模式核心能力数据冗余、读写分离自动故障转移数据分片、自动故障转移扩展性垂直扩展(读能力)垂直扩展(读能力)水平扩展(读写能力)单点故障主节点单点故障主节点单点故障(写瓶颈)无单点故障适用场景小规模读写分离中小规模高可用大规模高并发与高可用配置复杂度简单中等复杂。

2025-04-20 22:46:29 1038

原创 缓存 --- 缓存击穿, 缓存雪崩, 缓存穿透

问题类型触发条件解决方案核心实现技术击穿热点Key过期 + 高并发互斥锁、逻辑过期分布式锁(SETNX)、异步重建穿透查询不存在的数据布隆过滤器、空值缓存Bloom Filter、NULL占位雪崩大量Key同时过期随机过期时间、集群容灾过期时间随机化、Redis集群注意事项布隆过滤器需要预热数据,适用于静态数据(如商品ID列表)。互斥锁需设置合理的锁超时时间,避免锁过期后业务线程仍在执行。空值缓存的过期时间不宜过长,防止内存浪费。

2025-04-20 22:11:02 1260

原创 缓存 --- Redis性能瓶颈和大Key问题

某电商平台的商品评论数据存储在 Redis 中,使用列表(List)数据结构存储每个商品的评论 ID。将每个商品的评论列表拆分为多个小列表。本地缓存(Caffeine )

2025-04-20 18:23:27 1253

原创 缓存 --- 内存缓存 or 分布式缓存

定义:特点:使用案例:常用库:示例:分布式缓存(Distributed Cache)定义:特点:使用案例:常用库:示例:内存缓存 vs 分布式缓存特性内存缓存分布式缓存存储位置本地内存远程缓存服务器(如Redis、Memcached)数据共享不支持,数据隔离支持,数据可跨服务器共享访问速度极快(内存访问)较快(受网络延迟影响)扩展性有限(受限于单机内存)高(可通过增加服务器扩展)一致性差(多个服务器缓存不一致)较好(通过缓存服务器

2025-04-20 18:07:23 1441

原创 缓存 --- Redis基本数据类型

【代码】Redis --- 基本数据类型。

2025-04-16 23:28:28 1045

原创 C# --- yield关键字 和 Lazy Execution

立即执行(Eager Evaluation)延迟执行(使用yield)示例:生成斐波那契数列。

2025-04-12 23:33:55 1076

原创 C# --- IEnumerable 和 IEnumerator

正确做法:IEnumerable + IEnumerator。确保多次遍历互不干扰。

2025-04-12 23:06:12 1505

原创 设计模式 --- 观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,用于在对象之间建立一对多的依赖关系。当一个对象(称为“主题”Subject)的状态发生改变时,所有依赖它的对象(称为“观察者”Observer)会自动收到通知并更新。这种模式的核心是解耦主题和观察者,让它们可以独立变化。核心思想主题(Subject):维护一个观察者列表,提供注册、注销和通知机制。观察者(Observer):定义统一的更新接口,当主题状态变化时被调用。主题不需要知道观察者的具体实现,只需通过接口通知。

2025-04-08 21:36:48 1622

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除