自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Mark66890620

Mark66890620

  • 博客(75)
  • 收藏
  • 关注

转载 TCP连接,没有打开keepalive选项,没有数据交互,一端突然断电和一端的进程crash了,这两种情况有什么区别呢?

这个属于TCP异常断开连接的场景这个问题有几个关键词:没有开启keepalive;一直没有数据交互;进程崩溃;主机崩溃;正文我们先来认识认识什么是TCPkeepalive呢?这东西其实就是TCP的保活机制,它的工作原理我之前的文章写过,这里就直接贴下以前的内容。如果两端的TCP连接一直没有数据交互,达到了触发TCP保活机制的条件,那么内核里的TCP协议栈就会发送探测报文。如果对端程序是正常工作的。当TCP保活的探测报文发送给对端,对端会正常响应,这样TC...

2022-05-18 22:33:10 774

原创 Goland 报错:Found several package

安装了GoLand 2020.1,但是go安装了最新版的go 1.18版本后,Goland 报错:Found several package。原因是GoLand版本太低了,需要升级到最新版本,但是因GoLand无法升级,只能把go 1.18卸载掉(直接删除安装目录即可),重新安装go 1.16版本后,报错消失。...

2022-05-16 22:57:37 5313 2

转载 Go 语言的字串数据类型 String

Go 中的字符串值得特别关注,因为与其他语言相比,Go 中的字符串实现方式是非常不同的。GO 中字符串定义在双引号 "......" 之间,而不是单引号,与 JavaScript 不同。 Go 中的字符串是 ** UTF-8 ** 默认编码 这在 21 世纪的今天是非常有意义的。 由于 UTF-8 支持 ASCII字符集,因此在大多数情况下您无需担心编码问题。 但要深入了解 UTF-8 编码的工作原理,您一定要访问 这个维基百科页面。先来写一个简单的程序。使用 string 关键字来定义 s

2022-05-15 22:41:14 1915

原创 Go字符串使用for range循环和用for循环不一样踩的坑

func main(){ s:="abcd" fmt.Printf("%T\n",s[0]) //s[i]的类型为uint8 for i:=0;i<len(s);i++{ fmt.Printf("%T\n",s[i]) } //s[i]的类型为uint8 for _,v:=range s{ fmt.Printf("%T\n",v) } //v的类型为int32}相同字符串在使用不同遍历方式的时候,类型是不一样的.使用普通循环时,得到的类型是uin.

2022-05-15 22:01:42 607

转载 负载均衡算法了解吗?有哪些?

1、轮询(Round Robin)法轮询很容易实现,将请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,而不关心服务器实际的连接数和当前的系统负载。使用轮询策略的目的是,希望做到请求转移的绝对均衡,但付出的代价性能也是相当大的。为了保证pos变量的并发互斥,引入了重量级悲观锁synchronized,将会导致该轮询代码的并发吞吐量明显下降。轮询法适用于机器性能相同的服务,一旦某台机器性能不好,极有可能产生木桶效应,性能差的机器扛不住更多的流量。2、随机法通过系统随机函数,根据后台

2022-04-16 12:51:17 168

转载 MySQL innodb引擎的4大特性

一:插入缓冲二:二次写三:自适应哈希四:预读1.插入缓冲(insert buffer)插入缓冲(Insert Buffer/Change Buffer):提升插入性能,change buffering是insert buffer的加强,insert buffer只针对insert有效,change buffering对insert、delete、update(delete+insert)、purge都有效只对于非聚集索引(非唯一)的插入和更新有效,对于每一次的插入不是写到索引

2022-04-16 12:31:08 1307

转载 MySQL 高频面试题目二:InnoDB与MyISAM 聚集索引与非聚集索引区别?

区别:InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主

2022-04-16 12:28:51 683

转载 MySQL 高频面试题目一:一条SQL查询语句是如何执行的?

(1)客户端与数据库建立连接(2)查询缓存,如果命中缓存,则立即返回存储在缓存中的数据。(3)解析器先进行词法分析,将SQL语句打碎成一个个单词,根据构词规则识别单词中的关键字和非关键字,接着进行语法解析,判断是否满足MySQL的语句,接着生成语法树。如果语法错误则返回(4)解释器是分析语法有没有错误,但是它无法知道数据库中有没有数据表和字段,预处理器根据MySQL规则进一步检查解析树是否合法。如检查表名,列名是否正确,是否有表权限等。(5)查询优化器对解析树进行优化,...

2022-04-16 12:23:56 300

转载 【无标题】

疑问1:从已关闭的channel读取数据会怎么样?疑问2:重复关闭chan会怎么样?疑问3:向关闭的chan发送信号会怎样? 疑问1:从已关闭的channel读取数据会怎么样 刚接触go的channel,我在思考一个问题,chan是发送方关闭,还是接收方关闭,如果是发送方关闭,发送方发完数据,就关闭chan,那可能接收方还没接收完数据,读取关闭的信道会怎样? 验证1:有缓冲 package main import ( ...

2022-04-06 20:28:39 87

转载 Go channel的使用场景,用法总结

在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。channel的使用场景把channel用在数据流动的地方:消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ...channel的基本操作和注意事项channel存在3种状态:nil,未初始化的状态,只进行了声明,或者手动赋值为nil active,正常的channel,可读或者可写 closed,已关闭,千万不要误认为关闭chann

2022-04-06 20:13:42 2505

转载 接口的幂等性怎么设计?

什么是幂等? 幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。 二、使用幂等的场景 1、前端重复提交 用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的bug。 2、接口超时重试 对于给第三方调用的接口,有可能会因为网络原因而...

2022-04-05 19:01:38 2027

转载 nginx限流方案

一、引言 Nginx是被广泛使用的反向代理中间件,能够支持极高的并发访问,性能优越。在Nginx上添加限流功能是十分有必要的,能够对后端的服务进行保护,防止突发的流量致使应用崩溃。Nginx自带三种限流的方案,另外还支持集成lua模块进行限流。 二、ngx_http_limit_conn_module模块限流 ngx_http_limit_conn_module是连接数限流模块,用来对某个key对应的总的网络连接数进行限流,可以按照如IP、域名的维度进行限...

2022-04-03 22:30:26 1389

转载 数据库事务隔离级别有哪些?

数据库事务隔离级别: 1、Read Uncommitted(读未提交); 2、Read Committed(读已提交); 3、Repeatable Read(可重复读取); 4、Serializable(可串行化)。 在数据库操作中,一项事务(Transaction)是由一条或多条操作数据库的 SQL 语句组成的一个不可分割的工作单元,这些操作要么都完成,要么都取消。 数据库事务隔离级别 在实际应用中,数据库中的数据是要被多个用户共...

2022-04-02 18:12:11 2719

转载 Golang slice往中部添加元素的三种方式

场景如下,有一个切片:a = []int{1,2,4,5,6},想在中部添加一个元素,使得a = []int{1,2,3,4,5,6},有三种方式:1.创建临时切片:var a = []int{1,2,4,5,6}var b= a[2:]b = append([]int{3},b[0:]...)a=append(a[0:2],b...)2.利用append支持链式操作的特性:.var a = []int{1,2,4,5,6}a=append(a[:2],append([]int

2022-03-31 19:37:43 2031

转载 高并发网络编程之epoll详解

在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。本文便来介绍epoll的实现机制,并附带讲解一下select和poll。通过对比其不同的实现机制,真正理解为何epoll能实现高并发。select()和poll() IO多路复用模型select的缺点:单个进程能够监视的文件描述符的数量存在最大限制,

2022-03-29 21:49:54 336

转载 Golang panic 与 recover

概念 panic 与 recover 是 Go 的两个内置函数,这两个内置函数用于处理 Go 运行时的错误,panic 用于主动抛出错误,recover 用来捕获 panic 抛出的错误。 引发panic有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。 发生panic后,程序会从调用panic的函数位置或发生panic的地方立即返回,逐层向上执行函数的defer语句,然后逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数。...

2022-03-29 19:07:07 1157

转载 Golang 为什么slice和map是线程不安全的?

来源:为何 Go map 和 slice 是非线程安全的? - 尚码园

2022-03-29 18:49:41 573

转载 goland快捷键大全

快捷键 作用 备注ctrl + n 导航到类名ctrl + shift + n 导航到文件ctrl + e/ctrl + shift + e 打开到最近的文件/打开最近修改的文件ctrl + shift + i 简短地查看源定义ctrl + alt + m 重构表达式为函数 光标在表达式的末尾ctrl + space 快速返回实现 return 字段后使用ctrl+ shift+ a 工具调用 如 go tools,restful 等ctrl + shift + space

2022-03-28 18:04:28 2264

转载 Go 实战Go内存泄漏,pprof定位内存泄漏问题

引言: 最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露问题。 关于Go的内存泄露有这么一句话不知道你听过没有: 10次内存泄露,有9次是goroutine泄露。 我所解决的问题,也是goroutine泄露导致的内存泄露,所以这篇文章主要介绍Go程序的goroutine泄露,掌握了如何定位和解决goroutine泄露,...

2022-03-28 16:37:20 7861

转载 gin源码解析?什么是字典树?

介绍 gin 框架 基于 httprouter 实现最重要的路由模块,采用类似字典树一样的数据结构来存储路由与handle方法的映射.也是框架高性能的原因,有兴趣的同学可以自行查阅 本文提供 在线思维导图 搭配文章看事半功倍 Engine 容器对象,整个框架的基础 Engine.trees 负责存储路由和handle方法的映射,采用类似字典树的结构 Engine.RouterGroup,其中的Handlers存储着所有中间件 Context上下文对...

2022-03-28 12:37:47 186

原创 ACID是什么?常见的分布式算法有哪些?raft算法和Paxos比较?

ACID是什么?ACID 是数据库事务正确执行的四个基本要素的缩写。为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事

2022-03-28 12:07:21 2048

转载 Golang GC探秘:写屏障是什么?

参考:Go 语言垃圾收集器的实现原理 | Go 语言设计与实现由于Golang的GC机制一直在持续迭代,本文叙述的主要是Go1.9版本及以后的GC机制,该版本中Golang引入了 混合写屏障大幅度地优化了STW的时间。具体GC机制的版本迭代可以参考 :GC的过去、现在和未来基本概念GC的对象不再被需要的内存块,如果无法回收这部分内存将无法重复使用内存泄漏不再被需要的内存块,未在预期时间以内被回收的称为内存泄漏常见的GC方法:1.【PHP,Swift,Python等】引用计数.

2022-03-28 00:22:35 1613

转载 Go语言之 pprof

参考:深度解密Go语言之 pprof - Stefno - 博客园参考:https://www.jianshu.com/p/4e4ff6be6af9想做性能分析PProf想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下:runtime/pprof:采集程序(非 Server)的运行数据进行分析 net/http/pprof:采集 HTTP Server 的运行时数据进行分析是什么pprof 是用于可视化和分析性能

2022-03-27 23:53:27 140

转载 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?

高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低。所以,知道各种锁的开销,以及应用场景是很有必要的。接下来,就谈一谈常见的这几种锁:多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。 最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。 如果选择了错误的锁,那么在一些高并发的场景下,可能会降低系统的性能,这样用户体验就会非常差了。 所以,为

2022-03-24 19:46:53 419

转载 Kafka为什么吞吐量大、速度快?

Kafka为什么吞吐量大、速度快? - 久伴成忆 - 博客园Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。 Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万。 但是很多使用过Kafka的人,经常会被问到这样一个问题,Kafka为什么速度快,吞吐量大;大部分被问的人都是一下子就懵了,或者是只知道一些简单的点,本文就简单的介绍一下Kafka为什么吞...

2022-03-24 12:34:13 551

转载 Golang的runtime

runtime包含Go运行时的系统交互的操作,例如控制goruntine的功能。还有debug,pprof进行排查问题和运行时性能分析,tracer来抓取异常事件信息,如 goroutine的创建,加锁解锁状态,系统调用进入推出和锁定还有GC相关的事件,堆栈大小的改变以及进程的退出和开始事件等等;race进行竞态关系检查以及CGO的实现。总的来说运行时是调度器和GC,也是本文主要内容。scheduler首先说到调度,我们学习操作系统时知道,对于CPU时间片的调度,是系统的资源分配策略,如任务A在

2022-03-24 11:54:10 1560

转载 Golang gopark函数和goready函数原理分析

Golang-gopark函数和goready函数原理分析gopark函数goready函数前面介绍的scheduler和channel里面都与gopark和goready这两个函数紧密相关,但是站在上层可以理解这两个函数的作用,但是出于对源码探索,我们要明白这两个函数不仅仅做了啥,还要知道怎么做的。本文主要内容是从底层源码分析这两个函数原理:gopark函数goready函数gopark函数gopark函数在协程的实现上扮演着非常重要的角色,用于协程的切换,协程切换的原因一般有以下几种情况

2022-03-24 10:17:58 2179 1

转载 Golang中 context作用,原理,超时控制

什么是context从go1.7开始,golang.org/x/net/context包正式作为context包进入了标准库。那么,这个包到底是做什么的呢?根据官方的文档说明:Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes.

2022-03-24 09:53:45 849

原创 HTTP的常见状态码有哪些,代表什么含义?

首先状态码的开头不同代表不同的类型:1xx:代表指示信息,表示请求已接收,继续处理2xx:代表成功,表示请求已被成功接收,理解,接受3xx:重定向,表示完成请求必须进行进一步的操作4xx:客户端错误,请求有语法错误或请求无法实现5xx:服务器端错误,服务器未能实现合法的请求常见状态码:200OK:正常返回信息400BadRequest:客户端请求有语法错误,不能被服务器所理解403Forbidden:服务器收到请求,但是拒绝提供服务404NotFound:请求资源不存

2022-03-23 21:39:02 830

转载 TCP和UDP各有什么特点,两者有什么区别?

TCP是面向连接的,使用TCP连接需要经过三次握手,断开连接需要经过四次挥手。相比于TCP,UDP则是面向无连接的,它像一个随时可以进行通信的协议,只要接收方创建了Socket,设置了监听端口,就能接收到到达的UDP包,并且能随时建立Socket进行发包。TCP可以对数据的发送速率作控制,它具有流量控制和拥塞控制机制,通过控制滑动窗口的大小控制数据的发送速率。而UDP理论上是可以无限地向网络中发数据包的,它的发送速率取决它的应用程序设置。TCP保证可靠的数据传输,它根据速率控制,重传控制,还有数据校

2022-03-23 21:38:21 366

转载 HTTP与HTTPS的区别?

HTTP和HTTPS的主要区别在于HTTP协议传递的是明文数据,而HTTPS传递的是加密过的数据,也就是说HTTPS更具有安全性。也正由HTTPS需要保证安全性,所以它的性能要比HTTP差一点。单说安全性肯定是不够的,我打算扩展讲一下HTTPS是怎么解决安全性问题的,通过这些HTTP没有机制,反映出HTTPS与HTTP的区别。下面尝试把HTTPS加密的过程推导出来。推导过程不涉及复杂的实现细节:如何安全地进行数据传输?假设现在A和B要进行安全的通信,那么究竟怎样才算是安全的通信?很自然地会想到:

2022-03-23 21:33:14 93

转载 Golang调度器的GMP模型,GMP模型里为什么要有P?并行和并发,进程、线程和协程概念

并行(parallel): 物理上同一时间处理不同任务并发(concurrent): 逻辑上处理同时的任务的能力通常所说的并发编程,也就是说它允许多个任务同时执行,但实际上并不一定在同一时刻被执行。在单核处理器上,通过多线程共享CPU时间片串行执行(并发非并行)。而并行则依赖于多核处理器等物理资源,让多个任务可以实现并行执行(并发且并行)。对于用户层面来说,进程就是一块运行起来的程序,线程就是程序里的一些并发的功能。对于操作系统层面来说,标准回答是“进程是资源分配的最小单位,线程是...

2022-03-23 10:48:42 1173

转载 Golang对某一字符串排序

方法一:首先,字符串转为[]byte, 对切片排序, 最后切片转字符串str := "eat"b := []byte(str)sort.Slice(b, func(i, j int) bool { return b[i] < b[j]})str = string(b)方法二:首先字符串分割,得到字符串切片, 对切片排序, strings.join连接成新的字符串func sortString(str string) string { split := strings

2022-03-07 14:40:34 1235

转载 分库分表后如何部署上线

博客来源:https://www.cnblogs.com/rjzheng/p/9597810.html 引言 我们先来讲一个段子 面试官:“有并发的经验没?”应聘者:“有一点。”面试官:“那你们为了处理并发,做了哪些优化?”应聘者:“前后端分离啊,限流啊,分库分表啊。。”面试官:"谈谈分库分表吧?"应聘者:“bala。bala。bala。。”面试官心理活动:这个仁兄讲的怎么这么像网上的博客抄的,容我再问问。面试官:“你们分库分表后,如何部署上线的?”应聘者:“这!!!!!!”

2022-02-17 09:09:17 183

转载 redis集群方案有哪些?

Redis 集群面试汇总: 烟哥彩蛋 在面试中如果碰到下列问题,如何应用上本篇的知识呢?先明确一点,我推荐的是Redis Cluster。OK,开始举例说明 问题1:懂Redis事务么?正常版:Redis事务是一些列redis命令的集合,blabla...高调版: 我们在生产上采用的是Redis Cluster集群架构,不同的key是有可能分配在不同的Redis节点上的,在这种情况下Redis的事务机制是不生效的。其次,Redis事务不支持回滚操作,简直是鸡肋!所以基本不用!

2022-02-16 16:56:35 414

转载 如何保证Redis与数据库的双写一致性?

面试官心理分析你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?面试题剖析一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求。 更

2022-02-16 16:07:16 1590

转载 分布式id 雪花算法原理 数据库步长原理

一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 1、什么是分布式ID? 拿MySQL数据库举个栗子: 在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。 但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需

2022-02-14 17:06:53 730

转载 Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。 为

2022-02-12 17:56:11 26070 14

转载 MySQL在centos上主从配置,读写分离的配置

一:MYSQL主从配置  1.1 部署环境 主(master_mysql): 192.168.1.200 OS:CentOS 6.5      从(slave_mysql): 192.168.1.201 OS:CentOS 6.5 1.2 安装mysql 主和从: yum install mysql-server   1.3 配置 1.3.1 主配置(master...

2022-02-12 15:31:54 198

转载 Redis 哨兵Sentinel实现的机制与原理?部署方法?

1.哨兵Sentinel概述 1.概述 Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来 接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故 障迁移, 以及选择哪个从服务器作为新的主服务器。 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(

2022-02-11 16:28:31 305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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