- 博客(216)
- 资源 (2)
- 收藏
- 关注
原创 一文读懂Xmal语法基础命名空间
支持如x:Class、x:Name等属性,用于定义 XAML 文档中的元素、属性和指令。xmlns:XML 默认命名空间,包含WPF基础控件(如Button、Grid)。xmlns:mc:标记兼容性命名空间,用于定义标记兼容性文档中的元素、属性和指令。mc:Ignorable:标记兼容性忽略,用于指定标记兼容性文档中可以忽略的元素。,用于定义 Blend 文档中的元素、属性和指令。,用于定义当前文档中的元素、属性和指令。语法:用于复杂属性(如嵌套画刷):适用于简单属性值 比如宽高。
2025-04-08 16:31:47
634
原创 一文读懂数据结构
一对一的有序关系线性结构中的元素按逻辑顺序排列,每个元素(除首尾外)仅有唯一的前驱和后继,形成类似“排队”的链式关系有限性和连续性线性表是有限序列逻辑顺序可通过物理连续存储(数组)或逻辑指针连接(链表)实现,二者在性能上互补。
2025-04-07 17:40:28
607
原创 一文读懂网络通信传输层与应用层
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)每一条TCP连接只能是点到点的;
2025-04-03 14:01:06
996
原创 一文读懂网络通信
很多时候,在不完全清楚的情况下,总是会被socket,websocket,restful 风格,http 协议,tcp,rpc这些知识概念搞得很懵,所以为了能够理顺这些网络通信的概念。但是,前面说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发。4.3 三元组 又叫半相关 (协议,ip本地地址,本地端口号) 确定程序唯一性 五元组又叫全相关 (协议,本地地址,本地端口号,远地地址,远地端口号) 这样就唯一到唯一建立连接。
2025-04-02 16:39:39
855
原创 一文了解WPF技术简介
微软推出的用户界面框架,基于.NET Framework/.NET Core构建,专为开发高性能、高交互性的桌面应用程序设计桌面端的前端UI技术C# WPF桌面应用程序设计属于典型的C/S(Client/Server,客户端/服务器)架构,而非B/S(Browser/Server,浏览器/服务器)架构的Web开发。C/S架构:客户端需要安装本地程序(如WPF应用),负责界面交互和部分业务逻辑处理,与服务端通过TCP/IP等协议通信。
2025-04-01 16:30:08
825
原创 设计原则与模式关联以及记忆点
责任命令解释器,迭代中介备忘录,观察状态策略变,模板访问者收尾“(工厂方法、抽象工厂、单例、建造者、原型)“适配桥接组合树,装饰外观享元代理”“工厂造单例,建造原型机”
2025-04-01 10:16:34
198
原创 一文读懂Sql Server读写分离和分库分表
若主库的读 QPS(每秒查询数)上限为 10,000,增加 3 个从库后,总读 QPS 可扩展至 40,000。故障转移:若主库宕机,可从库快速提升为主库(如 AlwaysOn 自动故障转移),减少停机时间。主库无需等待从库确认,写操作延迟低,适合对一致性要求宽松的场景(如日志分析)。锁冲突:写操作需要独占资源(X 锁),会阻塞读操作(S 锁)和其他写操作。性能影响:写操作需等待从库确认,增加延迟,但读操作可无缝分流。主库(Primary):仅处理写操作,避免读操作占用资源。
2025-03-25 17:49:46
1360
原创 一文读懂Sql Server 中的锁机制
行版本控制(Read Committed Snapshot Isolation, RCSI)通过在 tempdb 中维护数据行的历史版本,使读操作无需申请共享锁(S锁),从而避免与写操作的锁争用。SQL Server 的锁机制是数据库并发控制的核心,用于协调多个事务对资源的访问。即使其他事务正在修改数据,这些未提交的修改对当前读操作不可见。写操作:仍需要排他锁(X锁),但不会阻塞读操作,因为读操作通过版本快照访问数据。读操作:基于事务开始时的 已提交数据快照 执行,仅读取其他事务已提交的版本。
2025-03-25 15:17:08
628
原创 .Net SSO 单点登录方式
访问应用A:打开 https://app1.example.com/Home/Index,由于未登录,自动跳转至 https://app1.example.com/Account/Login。访问应用B:打开 https://app2.example.com/Home/Index,浏览器自动携带 Cookie,应用B解密后直接授权访问。确保应用部署在子域名下(如 app1.example.com、app2.example.com)。应用B:https://app2.company.com(项目管理平台)
2025-03-24 15:12:06
1071
原创 C# BULK INSERT导入大数据文件数据到SqlServer
优先选择 SqlBulkCopy:适用于客户端数据源,无需处理文件权限。BULK INSERT 补充场景:适合服务器端已有标准化数据文件的定期导入。优化核心参数:合理设置批处理大小、锁机制及错误容忍度,结合业务需求选择编码与格式控制策略。
2025-03-24 11:08:04
928
原创 Sql Server 索引性能优化 分析以及分表
RID(Row Identifier):当表 没有聚集索引(堆表)时,SQL Server 为每一行数据分配的唯一物理地址,格式为 (文件号:页号:槽号)。回表是针对 表 没有 聚集索引的情况下,非聚集索引怎么去寻找数据的,如果有 聚集索引,就不用通过RID回表直接去 跟着 聚集索引建 流程去数据页找数据。叶子节点指向数据页:存储索引键值 + 行定位符(RID 或主键值),回表查询数据(类似书末的索引表,标注“主题→页码”)。区是 8个连续页的集合(共64KB),用于高效管理页的分配。
2025-03-21 16:16:03
1035
原创 C# 判断客户端socket 是否原生以及多路复用
网络五大io模型:阻塞io、非阻塞io、io多路复用、信号驱动模型(异步阻塞IO)、异步io((异步非阻塞IO)) 可以看之前的文章。
2025-03-20 15:31:17
494
原创 Redis 面试思路
原子加锁:通过 SET key unique_value NX PX timeout 命令实现原子性加锁,其中 NX 表示键不存在时设置,PX设置过期时间。偏向AP:Redis集群默认异步复制,主节点故障时可能丢失锁(但通过RedLock可提升一致性)。唯一标识:unique_value(如UUID)用于区分不同客户端,防止其他线程误删锁。锁续期:通过“看门狗”机制(守护线程定期续期)解决业务执行时间超过锁超时的问题。分段加锁:将资源(如库存)拆分为多个段(如100段),每个段独立加锁。
2025-03-18 16:29:07
515
原创 Kafka 的消息机制以及消息丢失等问题
同步条件:Follower 需在 replica.lag.time.max.ms 时间内追上 Leader 的数据进度,否则会被踢出 ISR 并标记为 OSR(Out-of-Sync Replica)。OSR 兜底:若 ISR 为空,根据 unclean.leader.election.enable 配置决定是否允许 OSR 成为 Leader(默认禁止,防止数据丢失)数据提交规则:消息必须被所有 ISR 副本确认后,才会被标记为已提交(Committed),此时消费者才能读取。
2025-03-18 14:37:36
889
1
原创 C# 一文读懂委托与事件
诞生:技术点出来的原因就是 有一些需要将方法作为入参 处理的情况 比如 业务处理完需要回调函数 那就需要传函数入参委托是C#中的一种类型安全函数指针,允许将方法作为参数传递或存储。它本质上是面向对象的,对方法签名抽象封装(参数列表和返回类型),并支持多播(绑定多个方法)。事件是基于委托的发布-订阅模式,用于对象间通信。它封装了委托的调用权限,确保外部代码只能通过+=和-=订阅或取消订阅。就是特殊的委托加了权限的委托只允许在声明的类内部 进行invoke 哪怕子类也不行 外部调用也不行。
2025-03-17 17:04:06
1195
原创 C# 集合 类型对比list、Ilist<T>、ICollection<T>、IEumerable<T>
Eumerable 对象是linq中静态类里面的一些方法 是对于IEnumerable的扩展 所以当使用linq的时候里面一些方法都可以用是。再来说ICollection 定义操作泛型集合的方法,可以看到截图中有一些封装的处理集合的方法。而linq对IEumerable进行了扩展封装,使得linq使用的时候可以用到很多的方法。所以说他是集合中必不可少的用到的迭代 所以每个集合和接口都继承他是理所应当的。● 如果想遍历、修改、添加、清空、使用索引,使用IList, IList。
2025-03-17 10:44:06
127
原创 C# 多线程 安全数据结构
多线程技术在如今cpu技术发展的前提下,可以说是高频率使用技术,自然会有相应的一些封装好的数据结构在内部满足了线程安全,以供使用。因为实现IProducerConsumerCollection的这些集合其实底层是链表结构所以在使用时判断集合的时候count操作复杂度On所以使用isemptyO1字典的话读取是需要锁操作的所以也尽量避免Count,IsEmpty,Keys,Values,CopyTo及ToArray这些操作
2025-01-20 10:33:24
357
原创 C# 多线程 Parallel 并行
比如一个集合100w 你需要对集合处理调整内容 那么你可以 分5个小集合 用 5个线程并行去处理 如果用task 的话 你可以创建5个task 然后 用task.wenall的方式在聚合集合后继续使用业务 那么你会发现很复杂 对于这种简单大量数据处理时 却需要为并行逻辑进行任务的多创建以及任务的顺序把控。2:Invoke 里面 3个task 并不是按照顺序执行的 也就是为什么说 尽量在 无共享资源下去使用 如果需要控制 子线程之间顺序 那么必然 用到了 之前的要点也就是线程同步。
2025-01-17 13:26:55
584
原创 C# 多线程发展史(面试思路)
但是还有一个弊端是业务顺序的把控,虽然线程同步 在共享资源 或者是 主线程的控制上有一个顺序的把控,但是 在复杂业务场景 多个子线程的业务执行顺序之间 也是需要把控的,如果还是通过task的 API 去控制 通过 continuewith 或者 whenany whenall的写法,实现是没有问题 但是可读性是 大打折扣。由于线程资源是比较可贵的 性能也跟线程的创建使用 密切相关 光确保使用正确是不足够的 必须要考虑 使用多个线程情况下 资源的问题,于是诞生了第二个要点。
2025-01-16 17:16:34
420
原创 C# 多线程 await async
因为 task 虽然简便了线程的使用 但是在 可读性方面有很大问题,很多任务之间依赖以及后续操作之间也可能依赖 定位 了解执行顺序变得 复杂。可以理解为 是 辅助 Task TPL 让封装变得更简易 让程序更简单好识别 通过await关键字。既然这个task 封装类 能满足开发 为什么还要学习 await async。1:Task 封装的 创建 异步操作线程 多个api 操作的方法。于是 async 而来。
2025-01-16 16:36:28
206
原创 C# 多线程 Task TPL任务并行
而大多数情况 对于程序开发而言 对于 线程异步处理具体实现是不需要关注的,关注的是业务的执行逻辑,也就是说。Task 也就是 TPL 任务并行库 其实可以理解为 对这个 线程池异步方式一个更抽象的表达。,只需要合理使用Task的方式 确保逻辑上的正确即可,而不是专注在异步操作线程大量代码中。2:== 为了节省操作系统线程资源 线程池 异步 方式管理==接下来 就是主要讲如何使用Task 的 api。为了 解决这种情况 ==Task ==来了。并且提供相应的api去使用。一种隐藏细节的封装,以。
2025-01-15 15:21:26
587
原创 C# 多线程 线程池以及异步APM EAP
资源 预先在池子里有一些线程 然后 从里面拿取空闲的线程进行逻辑,用途是用来 执行时间短的一些操作 能够在有限的线程中进行复用 好节省资源,就是 时间换空间 以稍微长的执行时间换取所创建线程所需要的空间资源。保持线程中的操作都是短暂的是非常重要的。不要在线程池中放入长时间运行的操作,或者阻塞工作线程。请注意线程池中的工作线程都是后台线程。这意味着当所有的前台线程(包括主程序线程)完成后,所有的后台线程将停止工作。线程池 是 clr 管理,每个clr 一个线程池实例。2.如何在线程池中正确执行等待。
2025-01-14 17:48:59
413
原创 C# 线程基础之 线程同步
ReaderWriterLockSlim 读写锁 就是 读可共享锁 写是互斥锁 当断点设置在写锁的过程中 可以看见 读取的时候被阻塞了。4.事件标识 ManualResetEventSlim 通过 set 通行 reset 设置阻塞 wait 阻塞。3.事件标识 AutoResetEvent 作用 类似lock 通过 waitone 阻塞与 set 通行。子线程中reset阻塞 并且wait等待 ManualResetEvent 用waitone。
2025-01-14 13:36:40
579
原创 C# 多线程基础 锁 死锁 Monitor lock
3:通俗将就是 俩个人都各自锁住一个资源 而恰好 要使用的其他资源 都是对方所持有的,无限等待。正常逻辑 主线程 子线程 在一开始分别 各锁住了一个对象 然后在各自业务中使用另一个对象。3:说明了Monitor.TryEnter 使用在拿不到的情况下 过期时间会自动放弃获取。1:代码没有完全都执行 可以看出 在锁住另一个对象后的代码 像是卡住没办法执行了。2:可以看到主线程是没拿到锁lock1 的 正常逻辑也是子线程拥有的 肯定拿不到。1:第一个案列可以看到 所有的代码逻辑都执行了。
2025-01-13 14:26:30
328
原创 C# IDisposable接口 与析构函数
非托管资源可以使用 析构函数 ~class 这样 GC回收的时候会去识别析构来进行一个非托管资源的释放 注意 因为还是GC 处理 还是不是及时 处理的 有GC的机制来决定。GC 自动回收 托管资源 但是因为标记并清除 方式 以及 垃圾对象的1代2代,并不是及时清理,那么问题来了。socket 连接 断开等 句柄资源 数据库连接资源 客户端连接断开日志资源清空等。在你需要手动控制回收的资源 类 继承IDisposable。那么要立即回收 托管资源 和非托管资源 怎么办?1.非托管资源怎么回收。
2024-12-27 17:34:41
299
原创 vs2022 nuget 程序包源 加载401 没权限解决方案
在控制面板 切换成大图标->凭据管理器->Windows Credentials->找到VS Credential 删除,重启vs,再次nuget管理里面选择你的NuGet包 后会再次提示输入机器登录名和密码,这个时候就输入访问数据源的账号正确就解决了。有些公司内容的程序包源 网页加载是可以的,但是nuget加载不出来,说明是vs设置的问题 ,如果页面直接访问源 也不行 可能是公司没开账号权限。如果是vs的问题 原因是:登录用户的密码输错了,清理后重新输入就好了。
2024-12-27 09:19:04
227
原创 socket 基本使用异步操作
这个状态参数怎么理解呢 就是你有一些信息需要记录当下的然后传给回调方法的,比如当前一些连接的ip信息之类的 需要传到回调方法中去,所以微软这个状态参数 就是方便你自定义对象 将你所需要的 传给回调,然后回调方法中接收一下。异步接收信息还需要注意的一点就是:异步建立连接的情况回调后 是开辟新的socket 去进行后续消息的操作的,你可以理解为 有一个人专门负责连接 连接好之后就开辟一个新的socket 由它一直进行消息管理。计算机主机 都是独立的 硬件,而网络通信是 在多个主机进行通信的必要手段。
2024-12-26 16:05:26
596
原创 sql server索引优化语句
第一步 建一个测试表第二步 插入100w数据 大概1分钟执行时间第三步 开始针对测试建立相应索引 可以直接数据库在表 索引中创建也可以使用 create index 语句去创建索引,这个就根据自己的测试来删除建立聚集 非聚集索引了第四步 开始执行sql查看索引效果 需要一个查询执行时间来看第五步 查看现有的索引信息 利用系统存储过程查看 是什么类型的 哪些字段。
2024-12-20 15:49:19
462
原创 C# 闭包写法 lambda 表达式
比如 (x,y)=>{return x+y;如果一个参数可不带(),如果逻辑简单可以不{}linq 表达 比 linq表达式要更简便。就是lambda表达式 引用了方法体外变量。1.用于 匿名委托函数表达。2.用于linq 查询表达。如果没有参数可以_来代替。(参数)=》{ 逻辑}
2024-12-18 17:00:58
418
原创 MongoDB 思路
分片机制 选择11个节点 3个config(主从1+1=2) 2个分片集群(加备份从就是2x3=6) 2个路由。1.全局设计 2.存储引擎 wiredtiger 3.存取数据 4 防止数据丢失 5.B+树。底层核心就是通过 wiredtiger引擎 将内容 写入 colletion 和 index 文件中。1 内部缓冲机制 缓存 60s/2G 同步到硬盘 但是如果没到同步条件就宕机 就需要双写。比如 将 订单 和 商品的 数据 整合 到一个文件中。2.router 路由。
2024-12-18 15:11:12
286
原创 C#多线程系列章节五
4.ConcurrentBag 添加元素使用Add方法,检查元素使用TryPeek方法,获取元素使,用TryTake方法 请避免使用提及的集合的Count属性。实现这些集合使用的是链表。所以 不要使用 task.result task.wait() Task.GetAwaiter().GetResult() 会阻塞获取结果。创建和销毁 线程都是比较麻烦的事情。线程池中的工作线程都是后台线程,意味着当所有的前台线程完成也跟着完结。前后台线程,一般代码显式创建的都是 前台线程。
2024-12-18 13:48:20
1273
原创 vue 组件通信 和 axios route
1.获取state模型,然后调用actions方法 然后传递mutations方法 然后影响state变量内容。import { useStore } from ‘vuex’ // 引入useStore 方法。const store = useStore() // 该方法用于返回store 实例。console.log(store) // store 实例对象。axios 其实就是 ajax+ io+system。2.只能mutations方法 改变state的值。
2024-07-12 17:30:19
355
原创 优惠券业务逻辑梳理
限制信息:比如一个用户用一次, 促销活动可用 会员等级多少可用 支付方式比如只有微信或者花呗可用。基本信息:以批次的概念生成一批数量的 优惠券,什么类型,什么途径,有效期,数量,名称 等等。批次全部生成 可能一个批次几万个优惠券,可能1k一次生成 不够了再去生成新的去用。活动类型有很多,有了优惠券信息之后,建活动,然后活动范围选好优惠券批次。客户领取优惠券,绑定至账户中,根据优惠券的有效期来判断 过期未使用。订单作废之后 返回优惠券,重新追加一张绑上 不影响原来使用的数据。
2023-10-08 11:20:35
715
【数据结构与算法】分块查找算法实现:有序分块数据快速检索方法研究
2025-04-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人