自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一线码农的专栏

阴沉的黑夜都是白天的前奏

原创 MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图

一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlserver是不可能再写了,这辈子都不会写了,只能靠技术输出mysql维持生活这样子。 二:了解架构图 ...

2020-06-02 08:22:10 60 0

原创 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

一:背景 1. 讲故事 曾今在项目中发现有同事自定义结构体的时候,居然没有重写Equals方法,比如下面这段代码: static void Main(string[] args) { var list = Enumerable.Range(0, 1000).Sel...

2020-05-31 08:39:04 85 0

原创 使用PInvoke互操作,让C#和C++愉快的交互优势互补

一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet = CharSet.Unicode)] [SecurityCritical] ...

2020-05-29 08:20:46 41 0

原创 阿里短信回持.net sdk的bug导致生产服务cpu 100%排查

一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk。 网址:https://help.aliyun.com/document_detail/114480.html 同事当时使用的是ons-.net v1.1.3版本,程序...

2020-05-26 17:06:52 79 0

原创 List的扩容机制,你真的明白吗?

一:背景 1. 讲故事 在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到几百万甚至千万的大集合这个扩容机制还真的需要挖一下,免的入戏太深,难以自拔。 为了方便讲述,...

2020-05-25 07:55:25 82 0

原创 BitArray虽好,但请不要滥用,又一次线上内存暴增排查

一:背景 1. 讲故事 前天写了一篇大内存排查在园子里挺火,这是做自媒体最开心的事拉,干脆再来一篇满足大家胃口,上个月我写了一篇博客提到过使用bitmap对原来的List<CustomerID>进行高强度压缩,将原来的List内存压缩了将近106倍,但是bitmap不是一味的好,你必须...

2020-05-22 07:53:04 207 0

原创 记一次排查线上程序内存的忽高忽低,又是大集合惹祸了

一:背景 1. 讲故事 昨天继续还技术债,优化一轮后的程序拉到线上后内存继续忽高忽低,低的时候20G,高的时候30G,过了一会又下降了几个G,毫无疑问,程序中有什么集合或者什么操作占用了大量内存,所以准备在28,29G的时候抓dump分析分析。 二:解决思路 从快照中找问题就像看病一样,根据病象猜...

2020-05-20 18:08:09 125 0

原创 追了多年的开发框架,你还认识指针吗?

一:背景 1. 讲故事 高级语言玩多了,可能很多人对指针或者汇编都淡忘了,本篇就和大家聊一聊指针,虽然C#中是不提倡使用的,但你能说指针在C#中不重要吗?你要知道FCL内库中大量的使用指针,如String,Encoding,FileStream等等数不胜数,如例代码: private u...

2020-05-16 09:58:11 128 0

原创 还不明白可空类型原理? 我可要挖到底了

一:背景 1. 讲故事 下决心做好自媒体到现在有一个月了,关注我的兄弟应该知道我产出了不少文章,号里的粉丝也多起来了,我也尽最大努力做到有问必回,现在是基础的、高深的问题都接踵而来,可我也只是一只小菜鸟,想飞也飞不动了(┬_┬),昨天号里有位朋友被面试官问到可空类型的原理,回答的不好,面试官也是,...

2020-05-14 08:44:40 157 0

原创 不要把异常当做业务逻辑,这性能可能你无法承受

一:背景 1. 讲故事 在项目中摸爬滚打几年,应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬_┬),比如说判断一个数字是否为整数,就想当然的用try catch包起来,再进行 int.Parse,如果抛异常就说明不是整数,简单粗暴,也不需要写正则或者其他逻辑,再比如一个字符串强制转化为En...

2020-05-11 08:52:18 178 0

原创 不要把异常当做业务逻辑,这性能可能你无法承受

一:背景 1. 讲故事 在项目中摸爬滚打几年,应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬_┬),比如说判断一个数字是否为整数,就想当然的用try catch包起来,再进行 int.Parse,如果抛异常就说明不是整数,简单粗暴,也不需要写正则或者其他逻辑,再比如一个字符串强制转化为En...

2020-05-11 07:40:29 80 0

原创 教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了

一:背景 1. 讲故事 前几天公众号里有位兄弟看了几篇文章之后,也准备用windbg试试看,结果这一配就花了好几天,(づ╥﹏╥)づ,我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题,所以我觉得有必要整理一下,让大家少走弯路。 二:一些基础概念 1. 在哪下载 现在安装windbg越...

2020-05-08 23:52:18 127 0

原创 内存迟迟下不去,可能你就差一个GC.Collect

一:背景 1. 讲故事 我们有一家top级的淘品牌店铺,为了后续的加速计算,在程序启动的时候灌入她家的核心数据到内存中,灌入完成后内存高达100G,虽然云上的机器内存有256G,然被这么划掉一半看着还是有一点心疼的,可怜那些被挤压的小啰啰程序????????????,本以为是那些List,Hash...

2020-05-06 22:00:25 196 0

原创 慎用ToLower和ToUpper,小心把你的系统给拖垮了

不知道何时开始,很多程序员喜欢用ToLower,ToUpper去实现忽略大小写模式的字符串相等性比较,有可能这个习惯是从别的语言引进的,大胆猜测下是JS,为了不引起争论,我指的JS是技师的意思~ 一:背景 1. 讲故事 在我们一个订单聚合系统中,每一笔订单都会标注来源,比如JD,Taobao,Et...

2020-05-04 17:23:55 160 0

原创 面向接口编程,你考虑过性能吗?

大家在平时开发中大多都会遵循接口编程,这样就可以方便实现依赖注入也方便实现多态等各种小技巧,但这种是以牺牲性能为代价换取代码的灵活性,万物皆有阴阳,看你的应用场景进行取舍。 一:背景 1. 缘由 在项目的性能改造中,发现很多方法签名的返回值都是采用IEnumerable接口,比如下面这段代码: ...

2020-05-02 11:48:07 207 0

原创 从GC的SuppressFinalize方法带你深刻认识Finalize底层运行机制

如果你经常看开源项目的源码,你会发现很多Dispose方法中都有这么一句代码: GC.SuppressFinalize(this); ,看过一两次可能无所谓,看多了就来了兴趣,这篇就跟大家聊一聊。 一:背景 1. 在哪发现的 相信现在Mysql在.Net领域中铺的面越来越广了,C#对接MySql的...

2020-04-30 21:36:50 171 0

原创 非常简单的string驻留池,你对它真的了解吗

昨天看群里在讨论C#中的string驻留池,炒的火热,几轮下来理论一堆堆,但是在证据提供上都比较尴尬。虽然这东西很基础,但比较好的回答也不是那么容易,这篇我就以我能力范围之内跟大家分享一下 一:无处不在的池 开发这么多年,相信大家对‘池’ 这个概念都耳熟能详了,连接池,线程池,对象池,还有这里的驻...

2020-04-29 08:23:48 179 0

原创 用long类型让我出了次生产事故,写代码还是要小心点

昨天发现线上试跑期的一个程序挂了,平时都跑的好好的,查了下日志是因为昨天运营跑了一家美妆top级淘品牌店,会员量近千万,一下子就把128G的内存给爆了,当时并行跑了二个任务,没辙先速写一段代码限流,后面再做进一步优化。 一: 背景 1. 背景介绍 因为是自己写的代码,所以我知道问题出现在哪里,如果...

2020-04-27 13:56:22 175 0

原创 用了这么多年的泛型,你对它到底有多了解?

现代程序员写代码没有人敢说自己没用过泛型,这个泛型模板T可以被任何你想要的类型替代,确实很魔法很神奇,很多人也习以为常了,但就是这么有趣的泛型T底层到底是怎么帮你实现的,不知道有多少人清楚底层玩法,这篇我就试着来分享一下,不一定全对哈。。。 一:没有泛型前 现在的netcore 3.1和最新的.n...

2020-04-24 11:13:33 177 0

原创 async,await执行流看不懂?看完这篇以后再也不会了

昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就不知道await,async有多重要,下面我举两个案例佐证一下? 一:案例一 【嵌套下的异步】 写...

2020-04-22 16:27:44 216 0

原创 我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程

在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能的减少lock锁次数甚至没有。 一:缘由 1. 业务背景 昨天在review代码的时候,看到以前自...

2020-04-21 17:49:23 191 0

原创 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?

前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀的例子。 一:异步 1. 到底解放了谁? <1> 从基础的同步说起 要说解放了谁,一定...

2020-04-20 19:21:53 811 0

原创 Linq中带有迭代索引的Select扩展方法,为啥知道的人不多呢?

一:背景 昨天在看C#函数式编程这本书的时候,有一处让我干着急,需求是这样: 给多行文字加上数字列表项。 针对这个需求你会如何快捷高效的给每个项目加上数字编号呢? 我看书中是这样实现的,如下代码 public class Program { public sta...

2020-04-17 15:27:53 124 0

原创 一个lock锁就可以分出低中高水平的程序员对问题的处置方式

说到lock锁,我相信在座的各位没有不会用的,而且还知道怎么用不会出错,但让他们聊一聊为什么可以锁住,都说人以群分,大概就有了下面低中高水平的三类人吧。 第一类人 将lock对象定义成static,这样就能让多个线程看到同一个对象,以此实现线程间互斥和保证同步,如果再深问为什么?就怕遮遮掩掩的说好...

2020-04-16 22:14:58 230 0

原创 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让大家眼见为实。 private static IEnumerable<T&g...

2020-04-15 17:15:39 212 0

原创 Linq下有一个非常实用的SelectMany方法,很多人却不会用

在平时开发中经常会看到有些朋友或者同事在写代码时会充斥着各种for,foreach,这种程式代码太多的话阅读性特别差,而且还显得特别累赘,其实在FCL中有很多帮助我们提高阅读感的方法,而现实中很多人不会用或者说不知道,这篇我就跟大家聊一聊。 一:SelectMany 这个方法绝对是提高开发速度的一...

2020-04-14 13:21:05 237 0

原创 当模板方法遇到了委托函数,你的代码又可以精简了

现如今当你翻看一些开源项目源码的时候,你会发现现在到处充斥着委托函数,如Func,Action,Predicate,确实现在的C#在函数式编程 的路上越来越成为主流,越来越显示威力,曾经的一些经典设计模式写法,在函数式下可以稍微优化一下了,这篇我们就来说说模板方法。 一:实际场景 1. 模板方法定...

2020-04-12 11:24:52 174 0

原创 为什么要用内插字符串代替string.format

知道为什么要用内插字符串,只有踩过坑的人才能明白,如果你曾今使用string.format超5个以上占位符,那其中的痛苦我想你肯定是能够共鸣的。 一:痛苦经历 先上一段曾今写过的一段代码,大家来体会一下: LogHelper.WriteLog(string.Format(@"==...

2020-04-11 13:12:31 204 0

原创 享受release版本发布的好处的同时也应该警惕release可能给你引入一些莫名其妙的大bug

一般我们发布项目的时候通常都会采用release版本,因为release会在jit层面对我们的il代码进行了优化,比如在迭代和内存操作的性能提升方面,废话不多说, 我先用一个简单的“冒泡排序”体验下release和debug下面的性能差距。   一:release带来的闪光点【冒泡排序】 ...

2017-03-22 17:18:13 393 0

原创 使用Task的一些知识优化了一下同事的多线程协作取消的一串代码

最近在看一个同事的代码,代码的本意是在main方法中开启10个线程,用这10个线程来处理一批业务逻辑,在某一时刻当你命令console退出的时候,这个 时候不是立即让console退出,而是需要等待10个线程把检测状态之后的业务逻辑执行完之后再退出,这样做是有道理的,如果强行退出会有可能造成子线...

2017-03-22 17:18:08 356 0

原创 从真实项目中抠出来的设计模式——第三篇:责任链模式

一:现实场景     有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给 实体赋值,如果是短信,邮件又是其他方式的赋值,等等此类,这种情况下一般会写出如下if判断,对吧,真实代码如下: 1 ...

2017-03-22 17:18:03 291 0

原创 从真实项目中抠出来的设计模式——第二篇:过滤器模式

一:实际场景介绍      我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动的人等等这样的条件,如果这时用户在淘宝上下了一个订单,那程序要判断的就是看一下此订单...

2017-03-22 17:17:58 414 0

原创 从真实项目中抠出来的设计模式——第一篇:策略模式

有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生, 当然这里也包括我。。。所以时间充裕一点之后就想重构一下,毕竟项目中的需求是不断变更的,面对需求变更,尽量做到最低限度的修改代码,最大化的扩充 新代码,还...

2017-03-22 17:17:53 319 0

原创 在redis中使用lua脚本让你的灵活性提高5个逼格

在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了。。。   一:Lua脚本       说来也巧,redis的大老板给了你解决这种问题的方...

2017-03-22 17:17:48 834 0

原创 redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合,后续的话,我就可以通过productid来查看该customerid是否买了此商品,如果购买了,...

2017-03-22 17:17:42 2680 0

原创 redis-cli中那些或许我们还不知道的一些实用小功能

玩过redis的朋友都知道,redis中有一个叫做redis-cli的小工具,我们可以利用它在test和develop环境下进行高效的模拟测试,然而在现实环境中, 我们只知道直接键入redis-cli启动命令的交互式,而这个对redis-cli来说绝对是九牛一毛,下面我逐一给大家演示下。   ...

2017-03-22 17:17:37 263 0

原创 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erlang写的一个成品,所以知道如何构建erlang的node集群就ok了,他需要一个统一的cook...

2017-03-22 17:17:32 665 1

原创 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景

说到队列的话,大家一定不会陌生,但是扯到优先级队列的话,还是有一部分同学是不清楚的,可能是不知道怎么去实现吧,其实呢,,,这东西已 经烂大街了。。。很简单,用“堆”去实现的,在我们系统中有一个订单催付的场景,我们客户的客户在tmall,taobao下的订单,taobao会及时将订单推送给 我们...

2017-03-22 17:17:27 596 0

原创 使用专业的消息队列产品rabbitmq之centos7环境安装

我们在项目开发的时候都不可避免的会有异步化的问题,比较好的解决方案就是使用消息队列,可供选择的队列产品也有很多,比如轻量级的redis, 当然还有重量级的专业产品rabbitmq,rabbitmq好就好在是用erlang(二郎神)开发的,它那天生的OTP并行计算框架,轻而易举的进程间通讯,我都恨...

2017-03-22 17:17:23 247 0

原创 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile

大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自己缺乏好的工具去监控sql,本篇给大家介绍的三种监控手段Log和SqlServer profil...

2017-03-22 17:17:18 701 0

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