- 博客(316)
- 收藏
- 关注
原创 《技术的正宗与野路子》
“要把知识梳理成系统的结构,要让头脑中的知识层次清楚,为此,我们需要阅读恰当的东西,需要不断地练习,需要克服种种困难。成长没有捷径可走。需要的是一个一个坚实的突破。”--- http://zhangtielei.com/posts/blog-programmer-learn.html...
2021-06-03 17:52:00 201
原创 自定义同步器
自定义同步器假如你想要实现一个自定义同步器,官方推荐的做法是将继承了AQS类的子类作为自定义同步器的内部类,而自定义同步器中相关的操作只需代理成子类中对应的方法即可。往下用一个简单的例子看看如何实现自己的锁,由于同步器被分为两种模式,独占模式和共享模式,所以例子也对应给出。独占式独占模式采取的例子是银行服务窗口,假如某个银行网点只有一个服务窗口,那么此银行服务窗口只能同时服务...
2020-12-08 16:49:00 439
原创 ProtoBuf 与 JSON性能比较
序列化:ProtoBuf 与 JSON 的比较 !介绍ProtoBuf 是google团队开发的用于高效存储和读取结构化数据的工具。什么是结构化数据呢,正如字面上表达的,就是带有一定结构的数据。比如电话簿上有很多记录数据,每条记录包含姓名、ID、邮件、电话等,这种结构重复出现。同类XML、JSON 也可以用来存储此类结构化数据,但是使用ProtoBuf表示的数据能更加高效,并且将...
2020-12-08 16:15:00 1663 1
原创 spring AOP
AOPAOP面向切面编程,生成目标方法所属类的代理类。代理类和目标类的关系:代理类继承目标类,并重载了目标类的方法。代理类重载方法体里加入了切面业务逻辑和目标类方法的调用。用户如何使用:从容器中获取目标类,实际上是获取代理类的实例, 代理类实例调用重载了父类的方法,就实现了AOP。AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,...
2020-12-05 18:03:00 168
原创 ElasticSearch之分词器edge_ngram和ngram的区别
ElasticSearch一看就懂之分词器edge_ngram和ngram的区别1 year agoedge_ngram和ngram是ElasticSearch自带的两个分词器,一般设置索引映射的时候都会用到,设置完步长之后,就可以直接给解析器analyzer的tokenizer赋值使用。这里,我们统一用字符串来做分词示例:字符串edge_ngram分词器,分词结果如下:{...
2020-11-16 20:18:00 957
原创 进程缓存Caffeine
简介对于用户来说,响应的快慢是判断一个系统的重要指标,缓存就是必不可少的优化工具,在一个高并发的场景中往往占有着非常重要的角色,所以开发人员需要根据不同的应用场景来选择不同的缓存框架,比如分布式缓存redis,或者进程缓存GuavaCache。收存储的元素,而GuavaCache是一款非常优秀的进程缓存框架,很好的提供了读写和自动失效的功能。而今天要介绍的进程缓存Caffeine,...
2020-11-07 14:45:00 323
原创 struct -- 结构体
struct -- 结构体structGo语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型person代表一个人的实体。这个实体拥有属性:姓名和年龄。这样的类型我们称之struct。如下代码所示:type person struct { name string age int}看到了吗?声明一个s...
2020-10-27 10:45:00 295
原创 `main`函数和`init`函数
main函数和init函数Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。Go程序会自动调...
2020-10-26 16:21:00 267
原创 go函数传值、传引用以及函数作为值类型
传值与传指针当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy, 当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上。为了验证我们上面的说法,我们来看一个例子package mainimport "fmt"//简单的一个函数,实现了参数+1的操作func add1(a int) int { a = ...
2020-10-26 16:07:00 195
原创 go new和make
Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。简单来说,new只分配内存,make用于slice,map,和channel的初始化。内置函数new按指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式。内置函数make对引用类型进行创建,编译器会将make转换为目标类型专用的创建函数,以确保完成全部内存分配...
2020-10-26 15:55:00 157
原创 粘包和拆包
粘包和拆包产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题;如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。如下图展示了粘包...
2020-10-23 15:58:00 265
原创 Spring Boot中使用WebSocket总结
简介所谓WebSocket, 类似于Socket,它的作用是可以让Web应用中的客户端和服务端建立全双工通信。在基于Spring的应用中使用WebSocket一般可以有以下三种方式:• 使用Java提供的@ServerEndpoint注解实现• 使用Spring提供的低层级WebSocket API实现• 使用STOMP消息实现使用Java提供的@ServerEndpoint注...
2020-10-22 11:05:00 543 1
原创 防盗链
什么叫防盗链说白了防盗链就是说这种加了防盗链签字的URL,而经过签名的URL能跟网络服务器的安全性体制相辅,进而将URL的应用管理权限限定在客户的APP,与此同时第三方平台即便取得URL也没法开展再次应用和散播。即选用服务端程序编写,根据URL过虑技术性保持的避免盗链的手机软件。何时必须提升防盗链(1)推流推流全过程中必须提升防盗链,由于客户的直播间码ID非常容易被第三方平台故意...
2020-10-21 10:46:00 250
原创 Java的JIT
什么是JIT:JIT编译器(just in time 即时编译器),当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为(Hot Spot Code 热点代码,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,完成这项任务的正是JIT编译器。目前主要的热点 判定方式有以下两种:基于采样的热点探测:采用这种方法...
2020-10-17 15:45:00 218
原创 C++指针和引用及区别
1、指针和引用的本质(是什么)(1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址。因此,指针的大小不会像其他变量一样变化,只跟当前平台相关——不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4字节。64位平台下,32位就不够用了,要想内存地址能够都一一表示,就需要64bit(但...
2020-10-16 11:50:00 191
原创 GO GC 垃圾回收机制
go语言垃圾回收总体采用的是经典的mark and sweep算法。• v1.3以前版本 STW(Stop The World)golang的垃圾回收算法都非常简陋,然后其性能也广被诟病:go runtime在一定条件下(内存超过阈值或定期如2min),暂停所有任务的执行,进行mark&sweep操作,操作完成后启动所有任务的执行。在内存使用较多的场景下,go程序在进行垃圾回收...
2020-10-16 10:58:00 166
原创 Go语言GMP模型
进程、线程、协程进程:进程是系统进行资源分配的基本单位,有独立的内存空间,单切换代价极高,进程间通信也比较麻烦线程:线程是CPU调度和分派的基本单位,线程依附于进程,与其他线程共享进程的资源,仅有自己的(程序计数器,一组寄存器的值,和栈),线程切换代价小(但是线程之间的切换可能会设计用户态和内核态的切换),由于共享进程资源,所以线程之间通信比较方便。协程:协程是一种用户态的轻量级...
2020-10-16 10:50:00 309
原创 鸭子类型
那什么鸭子模型?鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力。游泳起来像鸭子、叫起来也像鸭子,那么就可以是鸭子。动态语言,比如 Python 和 Javascript 天然支持这种特性,不过相对于静态语言,动态语言的类型缺乏了必要的类型检查。Go 接口设计和鸭子模型有密切关系,但又和动态语言的鸭子模型有所区别,在编译时,即可实现必要的类型检查...
2020-10-16 10:07:00 183
原创 go defer
最近看到一道Go语言的面试题,如下:package mainimport ( "fmt")func main() { defer_call()}func defer_call() { defer func() { fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func(...
2020-10-15 21:23:00 122
原创 go中的package和main关系
• 在Go语言中,和java的main是有所区别的,具体区别如下:在java中,任何一个java文件都可以有唯一一个main方法当做启动函数在go中,则是任何一个package中,都可以有唯一一个带有main方法的go文件也就是说,一个package下,只能有一个main方法,不管是在那个文件中,但是只能有一个,这个package是按照文件夹区分的• go run其实是执行一个e...
2020-10-15 10:41:00 2172
原创 go module
概述go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等使用go module之后我们可不用将代码放置在src下了使用 go module 管理依赖后会在项目根目录下生成两个文件 go.mod 和 go.sum。go.mod 中会记录当前项目的所...
2020-10-15 10:33:00 160
原创 打洞机制
首先要注意,路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包NAT打洞机制:当前客户端A想和客户端B建立连接,服务器开了两个端口,一个是主连接端口,一个是辅助连接端口首先,A,B与主连接端口建立连接。这个时候A要和B建立连接,首先A要和协助端口建立连接,然后在这个端口启动监听然后服务器主连接将A经过NAT-A转换的公网IP和端口号发送给B,B收到之后首先...
2020-10-14 17:03:00 203
原创 NAT映射表
• 要描述NAT, 要先讲讲私有地址和全局地址。我们说现在要从主机A给主机B发送消息,需要依赖的是主机A和主机B的端口号与IP地址。• NAT映射表存在在路由器里面,实现的是私有IP与公有IP之间的转换;实际上可能是你家一台路由器拥有一个公网IP,而所有连在这台路由器上的所有设备都共享一个公网IP。那么问题又来了,既然共享一个公网IP,那接受回来的数据又怎么知道到底应该是哪一台设备接受...
2020-10-14 16:52:00 3383 1
原创 cpu的MMU
• MMU:内存管理单元,用于完成虚拟内存和物理内存的映射,位于CPU内部;• 我们知道,程序文件一般放在硬盘上,当把程序运行起来时,程序被放入内存中,通过内存放入cache,通过cache进入cpu,下图中预取器就是负责从cache取出指令,然后由译码器译码,译码的作用就是要知道需要哪些寄存器配合完成指令,如该指令是一个加法运算,则译码器译码后发现需要使用到add,eax和ebx寄存...
2020-10-13 10:44:00 390
原创 socat命令
场景有时我们开发了一个api接口,自己调得好好的,接口文档也写好了,但别人调用时就是有问题,而当我们调试时,发现请求根本没进来或进来了却取不到调用参数,该怎么告知对方调用姿势哪不对呢?解决方法对于编码新手,一般会和对方撕扯一会,然后甚至去review对方的代码,这样也许能解决问题,但自己毕竟不熟悉别人系统的实现,耗费时间较长。另外api调用端可能因为封装方式不同或者加过一些拦截器...
2020-10-12 21:54:00 1021 1
原创 strace命令
概述按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。strace底层使用内核的ptrace特性来实现其功能。在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像...
2020-10-12 21:16:00 164
原创 Linux的文件描述符
文件描述符(fd)• 文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。• 我们都知道在Linux下一切皆文件。当然设备也不例外,如果要对某个设备进行操作,就不得不打开此设备文件,打开文件就会获得该文件的文件描述符fd( file discri...
2020-10-12 11:51:00 241
原创 PCB(Processing Control Block进程控制块)
PCB:进程控制块,实际是一个结构体,放在sched.h文件中,Linux下可以通过whereis sched.h命令查看具体路径该结构体主要包含:1.进程id用于区别进程2.进程的状态:就绪、运行、挂起、停止3.进程切换时需要保存和恢复的一些CPU寄存器寄存器放在CUP中,A程序和B程序分时执行的时候,A占用CPU执行一定时间,CPU便被B占用了,然后又轮到A执行,A的资源...
2020-10-12 11:37:00 492
原创 SkyWalking
APM系统• APM全称Application Performance Management应用性能管理,目的是通过各种探针采集数据,收集关键指标,同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案• Zabbix、Premetheus、open-falcon等监控系统主要关注服务器硬件指标与系统服务运行状态等,而APM系统则更重视程序内部执行过程指标和服务之间链路调...
2020-09-26 15:17:00 480
原创 CDN与DNS关系及其原理
1.什么是cdncdn全称是内容分发网络。其目的是让用户能够更快速的得到请求的数据。简单来讲,cdn就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据。举个例子,现在服务器在北京,深圳的用户想要获取服务器上的数据就需要跨越一个很远的距离,这显然就比北京的用户访问北京的服务器速度要慢。但是现在我们在深圳建立一个cdn服务器,上面缓存住一些数据,深圳用户访问时先访问这个...
2020-09-26 15:16:00 1235 1
原创 API接口防重放
背景• API接口由于需要供第三方服务调用,所以必须暴露到外网,并提供了具体请求地址和请求参数为了防止被第别有用心之人获取到真实请求参数后再次发起请求获取信息,需要采取很多安全机制;安全策略• 1.首先: 需要采用https方式对第三方提供接口,数据的加密传输会更安全,即便是被破解,也需要耗费更多时间• 2.其次:需要有安全的后台验证机制【本文重点】,达到防参数篡改+防二次请求...
2020-08-03 10:26:00 313
原创 chkconfig命令
chkconfig命令[root@localhost ~]$ ls /etc/init.d/httpd # /etc/init.d/目录下必须有启动脚本[root@localhost ~]$ chkconfig --add httpd # 添加服务,以便让chkconfig指令管理它[root@localhost ~]$ chkconfig httpd on # 设...
2020-04-18 21:49:20 263
原创 要成功先发疯
要成功先发疯创业者需具备的潜质——“变态”[温馨提示:变态需谨慎]通常的情况下每个人都认为自己具有开创一翻事业的潜质,事实上真正具有这种潜质的人其实并不多。很多人只是简单的认为自己什么条件都不缺,唯一缺的就是钱。实际上即使他们有钱,也终究会一事无成,最终得到的只是一次失败的教训,而且有更多的失败在等着他们。我看到很多文章都是鼓励创业的,其实那些文章的实质是怂恿傻子上吊。中国人有一句话...
2020-04-18 20:36:00 249
原创 情绪ABC理论
情绪ABC理论ABC理论是由美国心理学家埃利斯创建的。就是认为激发事件A(activating event 的第一个英文字母)只是引发情绪和行为后果C(consequence的第一个英文字母)的间接原因,而引起C的直接原因则是个体对激发事件A的认知和评价而产生的信念B(belief的第一个英文字母),即人的消极情绪和行为障碍结果(C),不是由于某一激发事件(A)直接引发的,而是由于...
2020-04-18 20:27:00 543
原创 树立和提高威信法
树立和提高威信法什么是树立和提高威信法所谓树立和提高自己的威信的方法,也就是身为负责人,无论是董事长、总经理,还是班组长,在上任伊始,在言语、态度、行为上表现自己,使员工接受自己的过程。现代心理学的实验结果告诉我们,借助于工资、奖金等激励措施,只能调动职工积极性的60%,其余40%的积极性要依靠领导者的威信去调动。威信高的领导对群众具有强大的吸引力、向心力,没有威信的领导对群众...
2020-04-18 17:03:00 292
原创 javaagent
javaagentJavaagent 是什么Javaagent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项。Premain-Class 指定的那个类必须实现 premain() 方法。premain 方法,从...
2020-04-18 15:51:00 306
原创 sonar 使用
sonarsonarQube是一个管理代码质量的开放平台,它可以从七个维度检测和扫描代码质量1.Complexity(复杂度分布):代码复杂度过高将难以理解、维护2.Duplications(重复代码):程序代码中包含大师复制粘贴的代码段是质量低下的表现3.Unit Tests(单元测试):统计并展示单元测试覆盖率4.Coding Rules(编码规范):通过Findbug...
2020-04-17 14:38:00 394
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人