简介 SCSS 是 Sass 的一种语法格式,可以理解成“加强版 CSS”。 普通 CSS 能写的内容,SCSS 基本都能直接写;在此基础上,SCSS 又加了变量、嵌套、混合...
简介 SCSS 是 Sass 的一种语法格式,可以理解成“加强版 CSS”。 普通 CSS 能写的内容,SCSS 基本都能直接写;在此基础上,SCSS 又加了变量、嵌套、混合...
简介 SELECT 1 是 MySQL 里很常见的一句 SQL。 它不是查询第一行,也不是查询第一列,更不是某种特殊语法。它的本质很简单: 最基础写法如下: 执行结果: 这条...
简介 上一篇文章已经把 YARP 的基础反向代理、路由、负载均衡、健康检查、限流都串了一遍。 这篇继续往下走,专门讲一个网关项目里很常见的能力: 在 YARP Gateway...
简介 YARP 全称是 Yet Another Reverse Proxy,是微软开源的 .NET 反向代理库。 一句话说清楚: YARP 不是一个单独安装的网关软件,而是一...
简介 很多项目一开始做缓存,通常都是这么写的: 刚开始看起来没什么问题。 但只要项目一复杂,这套逻辑很快就会变得又长又散: 每个地方都在手写两级缓存 本地缓存和 Redis ...
简介 很多项目一提到缓存,第一反应就是: 上 Redis 存个字符串 查不到就回数据库 刚开始这样写没什么问题。 但项目一复杂,几个现实问题就会很快冒出来: 多实例部署后,本...
简介 一提到缓存,很多项目里最先出现的通常是这几样东西: IMemoryCache IDistributedCache Redis 手写一套缓存工具类 刚开始看起来都能用。 ...
简介 平时写 C#,很少会主动去碰内存管理。 因为 .NET 已经把最麻烦的一层包掉了: 对象分配不用手动 malloc 对象释放不用手动 free 大部分时候只管写业务,程...
简介 异步代码一多,参数传递很快就会开始变味。 最常见的场景是这样: 入口层拿到了 TraceId 服务层要打日志 仓储层也想拿到同一个 TraceId 调了好几层 awai...
简介 很多业务系统刚开始都差不多: 一个 Service 里面既有新增、修改、删除 也有列表、详情、统计、搜索 前期这样写很顺手。 但只要项目稍微复杂一点,问题就会慢慢冒出来...
简介 多线程代码里最麻烦的一个点,不是“怎么开线程”,而是“数据到底该不该共享”。 很多并发问题,本质上都不是线程太多,而是: 好几个线程同时改同一份数据 于是开始加锁 锁一...
简介 MediatR 是 .NET 里很常见的进程内消息分发库。 它做的事情不复杂: 调用方发出一个请求,MediatR 找到对应的处理器执行。 这听起来像“多绕了一层”,但...
简介 在 .NET 高性能内存编程里,Span<T> 解决了一个很实际的问题: 不复制数据,也能操作一段连续内存。 但 Span<T> 本身还是比较“规矩”的。 比如: Sp...
简介 在 .NET 异步编程里,Task 大多数时候都是“自动完成”的。 比如: async 方法执行完了,返回的 Task 自动完成; HttpClient.GetAsyn...
简介 Task 和 async/await 是 C# 异步编程的核心,也是最容易被表面化理解的一组概念。 开发中常见的说法往往是: Task 就是线程; await 会新开一...
简介 在 .NET 异步里,如果你顺着这条线往下学: Task ValueTask IValueTaskSource 会发现难度是明显跳跃的。 Task 还是大多数业务代码的...
简介 在 .NET 里做性能优化时,很多人第一反应是: 少分配 少 GC 少临时对象 这个方向本身没有问题。 但问题在于,优化一旦开始,很容易走偏成另外一种极端: 看到对象创...
简介 在 .NET 项目里,只要分层稍微清晰一点,就绕不开这类代码: Entity -> Dto Request -> Command Command -> Aggregat...
简介 很多人第一次认真看 IL,通常不是因为“想学一门汇编”,而是因为碰到了这些问题: 同一段 C#,编译之后到底变成了什么 async/await、yield、lock 这...
简介 在 .NET 里提到同步,很多人第一反应通常是: 这没问题。 但只要你继续往下挖,很快就会碰到两个更底层的名字: 它们都能做“互斥”,但解决的问题并不是同一类。 一句话...