- 博客(72)
- 资源 (2)
- 收藏
- 关注
原创 http 2.0 一篇就够了
自1997年HTTP/1.1发布之后,HTTP/1.1便迅速占领了市场,时至今日(2022年)仍是当前使用最广泛的http协议。但是,这并不能说明HTTP/1.1就完美无缺了,仍然存在很多问题。
2022-10-09 10:27:43 13497
原创 JS的那些坑(一)
本文总结了JS在日常使用和面试中需要注意的知识点。变量提升请看以下代码输出什么 showName() console.log(myname) var myname = 'hello world' function showName() { console.log('函数showName被执行') }答案:答案和我们印象中js自上而下的执行顺序有些出入,这是由于js为了开发者写代码方便而省略掉的变量声明部分,而在编译阶段会将此部分补充完整,
2022-03-10 16:30:17 1248 3
原创 浮点数精度丢失问题详解
请看以下Go代码,会返回 0.7 吗? var num float32 for i := 0; i < 7; i++{ num = num + 0.1 } fmt.Println(num)答案可能出人意料,是:0.70000005 0.70000005也许有人会问,是不是Go语言的问题?换其他语言试试?OK,我们换JS试试。答案依然令人意外。除此之外,你还可以试试C、C++、Java、PHP等其他语言的float类型相加,看得到
2021-09-21 23:53:30 29462
原创 图解Go引用的底层实现
Go怎么可能有引用?得了吧~有人要说了,那利用make()函数执行后得到的slice、map、channel等类型,不都是得到的引用吗?我要说:那能叫引用吗?你能确定啥叫引用吗?这一切要从变量说起。什么是变量无论是引用变量还是指针变量,都是变量;那么,什么叫变量?其实变量本质就是一块内存。通常,我们对计算机内存进行操作,最直接的方式就是“在0x0201地址内存一个整数100,在0x00202地址存一个浮点数10.6,读取0x00203的数据…” 这种方式让机器来操作还行,如果直接写成代码,这一堆
2021-07-24 14:26:02 30441
原创 细谈Go变量的内存分布
我们程序中的变量大多被分配在内存的两个区域:statck和heap。还记得一个进程的内存分配是怎么样的吗?我们一起来回顾一下:进程内存中的stack和heap我们写的程序代码跑起来后,会是一个进程;OS会给我们的进程分配内存;内存结构大致如下:OS给一个进程分配的内存空间大致可以分为:代码区、全局数据区、栈(stack)、堆(heap)、环境变量区域以及中间空白的缓冲区六个部分。其中,数据的增长路径除栈(stack)是由高到低之外,其余的均是由低到高(可看图中数据箭头)。我们思考一下,为什么栈(
2021-05-20 13:11:28 40412 3
原创 为什么Go语言不允许循环引入?
每当Go程序编译出现循环引入报错的时候就非常让人头疼。那么,为什么Go不允许循环引入呢?我觉得原因如下:搞清楚package包的定位首先,搞清楚Go语言中package包的定位;Go语言的package和其他语言中的库、模块是相同的概念,在其他语言中,实现某个库或者模块需要建立"单独的项目",而在Go中,仅仅是一个包就够了。在正常Coding的时候,在我们项目中可以随便引入外来的项目(例如PHP项目引入PHP包),但是,我们可以随意的修改引入的包吗?不可以!在我们写PHP的时候,我们可以引外来的
2020-06-23 01:34:47 70156 2
原创 为什么数组要从零开始?
如题,数组第一个元素为什么要从零开始,而不从一开始?感觉这很反人类呀,正常来讲,一个集合的开始,不应该从一吗?对于这个问题,我觉得可以从以下两方面来考虑。设计层面我们先了解一下数组最基本的结构和寻址方式(即实现方式)。现在市面上无论是C、Java、PHP,还是Go或者其他编程语言,他们数组的实现方式,应该都是一样的:一段连续的内存。数组在分配内存的时候,我们会知道数组的开始地址(PS:...
2020-05-05 22:53:42 1715
原创 图解Go的unsafe.Pointer
相信看过Go源码的同学已经对unsafe.Pointer非常的眼熟,因为这个类型可以说在源码中是随处可见:map、channel、interface、slice…但凡你能想到的内容,基本都会有unsafe.Pointer的影子。看字面意思,unsafe.Pointer是“不安全的指针”,指针就指针吧,还安不安全的是个什么鬼?接下来,我们就来了解一下Go的这个“不安全的指针”unsafe.Poi...
2020-04-02 00:32:24 1103
原创 图解go反射实现原理
Go反射的实现和 interface和 unsafe.Pointer密切相关。如果对golang的 interface底层实现还没有理解,可以去看我之前的文章:Go语言interface...
2020-02-15 21:43:37 77183
原创 图解redis五种数据结构底层实现(动图哦)
redis有五种基本数据结构:字符串、hash、set、zset、list。但是你知道构成这五种结构的底层数据结构是怎样的吗?今天我们来花费五分钟的时间了解一下。(目前redis版本为3.0.6)动态字符串SDSSDS是"simple dynamic string"的缩写。redis中所有场景中出现的字符串,基本都是由SDS来实现的 所有非数字的key。例如setmsg"hell...
2019-12-02 09:10:00 78434
原创 动图了解I/O多路复用
啥叫I/O多路复用?epoll又是个什么东西?你或许看过很多文章,但是还是感觉云里雾里的,今天,我们抛开文字,释放动图,或许你就理解了。I/O多路复用通常的一次的请求过程...
2019-11-11 01:00:12 77077
原创 图解各路分布式ID生成算法
在分布式系统中,通常会用到分布式ID来标注数据的唯一性,而分布式ID的生成方式又多种多样,今天我们就来讨论一下主流的分布式ID生成策略。分布式ID基本需求全局唯一趋势递增信息安全全局唯一这是基本要求,不必解释趋势递增为什么要趋势递增呢?第一,由于我们的分布式ID,是用来标识数据唯一性的,所以多数时候会被定义为主键或者唯一索引。第二,并且绝大多数互联网公司使用的数据库是:My...
2019-10-02 00:11:54 907
原创 图解raft算法
在现实的分布式系统中,不能可能保证集群中的每一台机器都是100%可用可靠的,集群中的任何机器都可能发生宕机、网络连接等问题导致集群中的某个节点不可用,这样,那个节点的数据...
2019-06-16 10:45:24 1261
原创 图解Golang的内存分配
一般程序的内存分配在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况:以上是程序内存的逻辑分类情况。我们再来看看一般程序的内存的真实(真实逻辑)图:Go的内存分配核心思想Go是内置运行时的编程语言(runtime),像这种内置运行时的编程语言通常会抛弃传统的内存分配方式,改为自己管理。这样可以完成类似预分配、内存池等操作,以避开系统调用带来的性能问题,防止每次分配内...
2019-06-09 20:11:07 78016
原创 图解Mysql执行计划explain
以下是Mysql执行计划的图解。在使用explain的时候可以参考使用。PS:图片若小,可保存放大使用。更多精彩内容,请关注我的微信公众号 互联网技术窝 或者加微信共同探讨交流:...
2019-05-14 11:51:07 452
原创 本地安装es遇到的问题小结
自己搭建es集群,遇到如下问题(系统环境:CentOS 6.8 CentOS 7 ):root用户不能运行对于es中es总目录、logs目录、config目录中的文件必须要有读写权限要想外网访问,需要设置yaml文件的ip地址为:0.0.0.0需要设置虚拟内存 vm.max_map_count 的值不小于262144即使用sysctl命令:sysctl -w vm.max...
2019-05-10 21:44:02 349
原创 图解字符编码
啥叫字符集计算机只认识0和1那字符串“abc”咋显示呢?有个类似于字典的东西,告诉计算机在此种情况(在此编码格式)下,某些数字该显示什么。这种字典,就是字符集现有的字符集目前主要有以下几种字符集:ASCII字符集ISO 8859-1字符集GB2312字符集GBK字符集Unicode编码ASCII字符集共收录128个字符,都是些最最基础的字符。详情请看百度百科大...
2019-04-25 00:50:54 373
原创 图解Go的channel底层原理
废话不多说,直奔主题。channel的整体结构图简单说明:buf是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表sendx和recvx用于记录buf这个循环链表中的发送或者接收的indexlock是个互斥锁。recvq和sendq分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)...
2019-04-14 22:26:34 19605 6
原创 PHP性能优化
PHP虽然是世界上最好的语言,但是它本身作为一门脚本语言,其运行效率一直被人们所诟病。作为以PHP为开发语言的应用程序而言,PHP程序的性能能影响到整个架构性能的百分之30左右,不会超过百分之50,其余的是硬件的、操作系统的、存储的等等其他性能优化;因此,PHP程序的性能好坏,对于整个系统架构而言,还是很重要的。PHP的性能优化分为一下三个层次:这三个层次性能优化的难度依次上升,效果却依次...
2019-04-14 17:59:19 357
原创 图解Go select语句原理
Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。以上说法都正确。I/O多路复...
2019-03-31 17:23:29 2049
原创 图解Golang的GC算法
虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。以下是Golang GC算法的里程碑:v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrier经典的GC算法有三种:引用计数(reference counting)、标记-清扫(mar...
2019-03-10 22:53:33 18571
原创 Go并发原理
Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。并发(concurrency)和并行(parallellism)并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒...
2019-03-05 10:59:03 69834
原创 秒懂InnoDB的锁
今天我们来聊聊MySQL中InnoDB存储引擎的锁。锁是数据库系统系统区别于文件系统的一个关键特性。lock和 latchlatchlatch在MySQL中是用来保证并发多线程操作操作临界资源的锁,锁定的对象线程,是和咱们使用的Java等传统语言中的锁意义相近,而且没有死锁检测的机制。locklock是MySQL中在事务中使用的锁,锁定的对象是事务,来锁定数据库中表、页、行;通常只有...
2019-02-25 11:16:36 69310
原创 MYSQL的SQL性能优化总结
很多时候,我们的程序出现的“性能问题”,其实是我们自己写的那&quot;坨&quot;代码的问题,是自己Coding的问题,是Mysql的DML语句使用的问题。以下是我总结的关于MySQL DML语句的使用中需要注意的点。对于select *要时刻保持谨慎的态度绝大多数情况,是不需要select *的。一旦使用了这种语句,便会让优化器无法完成索引覆盖扫描这类优化,而且还会增加额外的I/O、内存和CPU的消耗。...
2019-02-16 14:20:49 1570 1
原创 Golang非CSP并发模型外的其他并行方法总结
Golang最为让人熟知的当属CSP并发模型,也就是由goroutine和channel构成的[GMP并发模型](https://i6448038.github.io/2017/12/04/golang-concurrency-principle/),具体内容不在赘述了,可以翻回之前的文章查看。在这里,要讲讲Golang的其他并发方式。Golang不仅可以使用CSP并发模式,还可以使用传统的共...
2018-12-22 02:42:05 69597
原创 图解Go语言interface底层实现
Go的interface源码在Golang源码的runtime目录中。Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。Go的interface是由两种类型来实现的:iface和eface。其中,iface表示的是包含方法的interface,例如: type Example interface{ }...
2018-10-03 13:49:48 4922 1
原创 解剖Go语言map底层实现
map是Go语言中基础的数据结构,在日常的使用中经常被用到。但是它底层是如何实现的呢? Golang中map的底层实现是一个散列表,因此实现map的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫hmap(a header for a go map),一个叫bmap(a bucket for a Go map,通常叫其bucket)。这两种结构的样子分别如下...
2018-08-26 02:37:30 86163 24
原创 快速理解Go数组和切片的内部实现原理
很多人对Go语言的array和slice傻傻分不清楚,今天我们就从底层出发,来聊聊它俩到底有什么区别。数组几乎所有计算机语言,数组的实现都是相似的:一段连续的内存,Go语言也一样,Go语言的数组底层实现就是一段连续的内存空间。每个元素有唯一一个索引(或者叫下标)来访问。如下图所示,下图是[5]int{1:10, 2:20}数组的内部实现逻辑图:由于内存连续,CPU很容易计算索引(即...
2018-08-12 20:12:19 77700
原创 Go语言的那些坑
Golang是我最喜欢的一门语言,它简洁、高效、易学习、开发效率高、还可以编译成机器码… 虽然它一出世,就饱受关注,而且现在在市面上逐渐流行开来,但是,它毕竟是一门新兴语言,还有很多让人不太习惯的地方(即坑,(^__^)),我作为新手,一边学习,一边踩坑,希望对其他人有借鉴作用。文件名字不要轻易以__test.go为结尾Golang的source文件的命名和其他语言本无差别,但是Gola...
2018-08-08 21:39:06 1017 2
原创 Golang奇葩点
本文即Go语言的那些坑二。Golang中函数被看做是值,函数值不可以比较,也不可以作为map的key请问以下代码能编译通过吗?import ( &amp;quot;fmt&amp;quot;)func main(){ array := make(map[int]func ()int) array[func()int{ return 10}()] = func()int{ ...
2018-08-08 21:26:53 776
原创 golang错题集
本文即Go语言的那些坑三。不要对Go并发函数的执行时机做任何假设请看下列的列子:import ( &amp;amp;amp;quot;fmt&amp;amp;amp;quot; &amp;amp;amp;quot;runtime&amp;amp;amp;quot; &amp;amp;amp;quot;time&amp;amp;amp;quot;)func main()
2018-07-18 01:25:23 1139 2
原创 HTTP 缓存详解
用途HTTP缓存主要用在对一些实时性要求不高的静态文件进行的缓存,往往都是存在浏览器端,防止这些“多余”的请求重复的访问服务器,对服务器造成压力,从而提高网站的性能。原理现有两端,浏览器C和服务器端S。浏览器向服务器发送请求,获取一个文件f服务器就把f给返回浏览器假如这个文件的内容变化不是那么快,一两周更新一次,浏览器每次请求服务器都返回相同的文件,岂不是对服务...
2018-04-29 01:40:42 6419 5
原创 计算机基本存储单位及其关系
1 位(bit): 计算机中最小的存储单位,只能存储0或者1。1 字节(b):8位(bit)。 就是byte,同计算机语言(例如Java、PHP等)中的byte是一回事儿。1 kb: 1024 个字节。1 mb: 1024 kb1 gb: 1024 mb1 tb: 1024 gb1 pb: 1024 tb1 eb: 1024 pb字符字符是指计算机中使用的字...
2018-03-31 15:49:33 81901
原创 Redis数据复制
Redis数据复制Redis的复制特性和MySQL类似,都是采用的主从(master、slave)的方式。Redis复制启动过程以上为一个从服务器和一个主服务的情况下的过程。 当多个从服务器尝试连接一个主服务器的时候,略有不同: 1、假如主服务器BGSAVE尚未执行,多个从服务器就连上主服务器了 :那么,所有从服务器都会收到相同的快照文件和相同的缓冲区写命令 2、假如主服...
2018-03-25 12:56:40 5246
原创 swagger和gitlab结合做API文档
使用docker技术,将gitlab和swagger做一个有机的结合,达到的效果为:每次提交代码,都会自动生成swagger API文档。以下是实现流程步骤:代码和目录结构docker-compose.yml文件书写swagger_ui: image: swaggerapi/swagger-ui:latest container_name: swagger_ui ports: -
2017-09-17 02:36:29 5456
原创 5分钟了解swagger
随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。 前端和后端的唯一联系,变成了API接口;API文档变成了前后端开发人员联系的纽带,变得越来越重要,swagger就是一款让你更好的书写API文档的框架。其他API文档工具没有API文档工具之前,大家都是手写API文档的,在什么地方书写的都有,有在confl
2017-08-27 20:47:06 352643 39
原创 php、nginx 两个分开的容器相连连不上的问题总结
php、nginx 两个分开的容器相连连不上的问题总结在网上搜罗了一圈,发现所有牵扯到php和ngin的镜像,都是php-nginx“粘”在一起的,想要搜到一个php、nginx俩分开的镜像还真不好找。于是便自己制作。但是在制作过程中,发现php和nginx通过docker的``link``指令连在一起的时候,总是连不上,经过了一番折腾,终于发现了其中的猫腻。应该注意三个点:nginx配置记得要
2017-08-20 23:57:14 5296
原创 互联网产品研发流程
研发流程研发流程相当关键,关系到整个研发团的开发效率,现在的产品的研发一般会以产品经理(Product Manager)为中心来展开,招一个靠谱的PM在有些时候可以扭转乾坤~ 在之前经历的公司中,有一家公司的流程让我受益匪浅:Created with Raphaël 2.1.0PM研发产品A,和相关部门负责人沟通完毕后,确定了项目内容制作简易的prd流程图和大家开会讨论产品是否可行,做可行性分析精
2017-05-16 01:37:40 5608 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人