自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 https原理

加密对称加密秘钥一个(通讯双方用同一把要是加密解密)效率较高无法直接暴露在网络上传输非对称加密公钥+私钥(私钥加密,公钥解密;私钥server端自己持有,公钥发送给消费端;通讯双方相互都给对方自己的公钥,自己保留私钥,然后用自己私钥加密,对方用对应的公钥解密)如何确认别人给你的公钥是合法的:ca证书 ,向权威机构A获取对应的通讯端的公钥。=>如何证明A是合法的=>向更权威的机构B确认A是合法的=>...https步骤1,通过向权威机构获取证书,来获取对方

2020-11-05 11:39:31 178

原创 选举算法-redis集群

Raft[编辑]维基百科,自由的百科全书跳到导航跳到搜索关于木筏,请见“筏”。Raft是一种用于替代Paxos的共识算法。相比于Paxos,Raft的目标是提供更清晰的逻辑分工使得算法本身能被更好地理解,同时它安全性更高,并能提供一些额外的特性。[1][2]:1Raft能为在计算机集群之间部署有限状态机提供一种通用方法,并确保集群内的任意节点在某种状态转换上保持一致。Raft算法的开源实现众多,在Go、C++、Java以及Scala中都有完整的代码实现。Raft这一名字来源于"Reli...

2020-11-05 11:28:32 982

转载 图解 TCMalloc

前言TCMalloc是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、在多核处理器能够 scale。据称,它的内存分配速度是 glibc2.3 中实现的 malloc的数倍。之所以学习 TCMalloc,是因为在学习 Golang 内存管理的时候,发现 Golang 竟然就用了鼎鼎大名的 TCMalloc,而在此之前虽然也对内存管理有过一些浅薄的了解,但一直没有机会深入。因此借此机会再巩.

2020-10-29 23:55:18 308

原创 mysql主键索引为什么用B+树而非B树,红黑树等

接下来我们就通过了解B+树去全面解决这几个问题。一、B+树的数据结构树的概念我的就赘述了,其他文章都写的非常清楚了。我们要注意的一个点:InnoDB和MyIsam在存储的区别。InnoDB主键索引的存储结构是:叶子节点存储了主键值和其他字段数据值其他索引的存储结构是:叶子节点存储了索引值和主键索引值区别是其他索引存的是主键索引值MyIsam索引的存储结构是:叶子节点存储了主键值和数据记录的地址主键索引和其他索引存储结构是一样的说B+树之前先说说B树,B+树是在B树基础上

2020-10-29 23:24:54 1090

原创 mysql 当前读&快照度&mvcc

todo

2020-10-29 13:57:41 458

转载 为什么Redis集群有16384个槽

我在《那些年用过的Redis集群架构(含面试解析)》一文里提到过,现在redis集群架构,redis cluster用的会比较多。如下图所示对于客户端请求的key,根据公式HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作!那大家思考过,为什么有16384个槽么?ps:CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不

2020-10-29 11:15:34 146

转载 redis集群

本文实现环境centos 7.3 redis 4.0 redis工作目录 /usr/local/redis 所有操作均在虚拟机模拟进行一、集群简介集群是为了解决主从复制中单机内存上限和并发问题,假如你现在的云服务内存为256GB,当达到这个内存时redis就没办法再提供服务,同时数据量能达到这个地步写数据量也会很大,容易造成缓冲区溢出,造成从节点无限的进行全量复制导致主从无法正常工作。那么我们就需要把单机的主从改为多对多的方式并且所有的主节点都会连接在一起互相通信。这样的方式既可以分

2020-10-29 11:02:59 269

原创 nginx负载均衡配置

负载均衡 - 配置 # 首先,你要有两台或以上可以提供相同服务的Web服务器,不然这个负载均衡配置就没有意义! # 在配置过程中只需要改代理服务器的配置就行,其他服务器不用管。 - vim /usr/local/nginx/conf/nginx.conf # 在http下添加如下代码 upstream item { # item名字可以自定义 server 192.168.101.60:81 参数

2020-10-28 14:32:02 215

原创 堆和栈

堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆与栈1.1 栈简介栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。参考如下代码:int main() { int b; //栈 char s

2020-10-27 21:42:40 2741

原创 什么是队头阻塞以及如何解决

前言通常我们提到队头阻塞,指的可能是TCP协议中的队头阻塞,但是HTTP1.1中也有一个类似TCP队头阻塞的问题,下面各自介绍一下。TCP队头阻塞队头阻塞(head-of-line blocking)发生在一个TCP分节丢失,导致其后续分节不按序到达接收端的时候。该后续分节将被接收端一直保持直到丢失的第一个分节被发送端重传并到达接收端为止。该后续分节的延迟递送确保接收应用进程能够按照发送端的发送顺序接收数据。这种为了达到完全有序而引入的延迟机制非常有用,但也有不利之处。假设在单个TCP连接上

2020-10-25 23:25:10 1759

原创 描述一次完整请求

请求浏览器输入url地址,url地址为统一资源定位符,有着标准的格式,浏览器能够识别,可以统一处理。(应用层HTTP) 浏览器把url域名发送给dns服务器,dns服务器解析域名返回IP地址。(应用层HTTP) 因为http协议是基于tcp协议,接下来要建立tcp协议:三次握手建立tcp协议。(目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,这样建立的 TCP 连接,就可以在多次请求中复用。)(传输层TCP) tcp连接建立以后,浏览器

2020-10-25 23:24:09 109

原创 问题汇总

KS调度机器人顶举指定容器的商品到指定站点,完成【分拣投递】并打包出库流程。FWA模型主要是登记作业动作,并进行库存维护,触发订单状态扭转。 Flip AGV子仓: 借鉴Go GMP并发模型思想,设计分拣投递系统。 SocketGateWay缓存池:避免重复连接和连接复用。数据层面:32个站点,8秒做一次投递任务,一小时产能为:3600/8 * 32 = 1.44万件QPS:1/8*32=4 ---- 1*32=32 = 4—32之间JDBUV:1.3亿日活:130..

2020-09-02 11:04:33 1182

原创 常用负载均衡模式

1. 集中式LB(Proxy Model)集中式LB.png在服务消费者和服务提供者之间有一个独立的LB,通常是专门的硬件设备如 F5,或者基于软件如 LVS,HAproxy等实现。LB上有所有服务的地址映射表,通常由运维配置注册,当服务消费方调用某个目标服务时,它向LB发起请求,由LB以某种策略,比如轮询(Round-Robin)做负载均衡后将请求转发到目标服务。LB一般具备健康检查能力,能自动摘除不健康的服务实例。 该方案主要问题:单点问题,所有服务调用流量都经过LB,当服务数量和调用量

2020-07-09 15:24:23 1425

原创 算法练习

链表反转,非递归实现func resv4(head *LinkedNode) (nn *LinkedNode) { var pre, next *LinkedNode for head != nil { next = head.nextNode // 1.next先指向第二个节点,node为当前节点 head.nextNode = pre // 2.反转当前的链表 pre = head // 3.保存当前节点为上一个节点,共下次反转使用 head = ne

2020-07-08 23:36:44 84

转载 Nginx服务器的内部核心架构设计

前言Nginx 是一个 免费的,开源的,高性能 的 HTTP 服务器和 反向代理,以及 IMAP / POP3 代理服务器。 Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx是一个 Web 服务器,也可以用作 反向代理,负载均衡器 和 HTTP 缓存。正文1. Nginx的整体架构1.1. 主进程Nginx 启动时,会生成两种类型的 进程*,一个是 主进程(master),一个(windows 版本的目前只有一个)或 多个工...

2020-07-01 18:20:44 144

原创 TCP/IP四层模型

TCP/IP 网络分层模型还是先从 TCP/IP 协议开始讲起,一是因为它非常经典,二是因为它是目前事实上的网络通信标准,研究它的实用价值最大。TCP/IP 当初的设计者真的是非常聪明,创造性地提出了“分层”的概念,把复杂的网络通信划分出多个层次,再给每一个层次分配不同的职责,层次内只专心做自己的事情就好,用“分而治之”的思想把一个“大麻烦”拆分成了数个“小麻烦”,从而解决了网络通信的难题。你应该对 TCP/IP 的协议栈有所了解吧,这里我再贴一下层次图。TCP/IP 协议总共有四层,就像搭积木

2020-07-01 15:26:23 12800

转载 redis主从同步

什么是主从复制持久化保证了即使 redis 服务重启也会丢失数据,因为 redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 redis 服务器的硬盘损坏了可能会导致数据丢失,如果通过 redis 的主从复制机制就可以避免这种单点故障,如下图:说明:主 redis 中的数据有两个副本(replication)即从 redis1 和从 redis2,即使一台 redis 服务器宕机其它两台 redis 服务也可以继续提供服务。主 redis 中的数据和从 redis 上的.

2020-06-30 11:02:28 147

转载 进程间通信IPC

IPCInterProcess Communication一、进程间通信的概念每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)进程间通信模型二、进程间通信的7种方式第一类:传统的Unix通信机制1. 管道/匿名管道(pi.

2020-06-29 22:59:15 251

原创 判断二叉树是否镜像对称,编程实现

思想:若此树就一个节点或者没有节点,则为对称。 若此树不值一个节点,则分别比较其左节点和右节点的值。 然后在比较左节点和右节点的比较中,在分别比较,左节点的左子树跟右节点的右子树,左节点的右子树,跟右节点的左子树是否对称相等。 同时注意,左节点为空和左节点不为空右节点不为空场景。type Tree struct { Data interface{} Left *Tree Right *Tree}/*判断二叉树是否镜像对称,编程实现*/func MirrorTree(tree T

2020-06-28 04:30:57 386

原创 实现一个最大栈,包含Push、Pop、Max方法,Max方法要求返回当前栈内最大元素值

简单版package mainimport "fmt"type Stack struct { Value []int MaxV int MinV int}func (this *Stack) Push(i int) { this.Value = append(this.Value, i) if i > this.MaxV { this.MaxV = i } if this.MinV == 0 || i < this.MinV { this.MinV

2020-06-28 03:52:28 694

转载 Linux IO模式及 select、poll、epoll详解

同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。一 概念说明在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于

2020-06-27 10:05:09 90

原创 golang MPG模型

线程与协程区别线程:是系统级线程,由系统自动创建,和销毁。 协程:架设在系统级线程之上的,由用户级线程,由用户(或者程序)完全控制的代码执行流程。用户级线程的创建销毁调度状态变更以及其中的代码和数据完全需要我们的程序自己去实现和处理。协程优势协程创建和销毁并不用通过操作系统去做,所以速度会很快。 不用操作系统调度运行,所以往往很容易控制,所以很灵活。协程劣势最明显也最重要的一个劣势就是复杂。线程一切操作系统代劳,而协程必须自己实现操作。GMP模型Mmachine:系统级线程

2020-06-27 00:43:49 605 1

原创 ElasticSearch搜索原理

倒排索引索引的创建一般分为以下几步: 第一步:将文档交给切词组件(Tokenizer)进行切词处理 第二步:将得到的词元(Token)交给语言处理组件 第三步:将得到的词(Term)交给索引组件 第四步:由索引组件针对词建立索引针对上述步骤,我们给出2个示例文档,加以详细说明 Document 1:Students should be allowed to go out with their f...

2020-06-26 22:21:01 139

原创 redis持久化

快照RDB优点数据结果集,文件小,文件直接就可以做冷备。 恢复数据比较快,直接恢复数据。缺点致命的是丢数据,快照是按照频率保存快照数据,频率太频繁,大大影响redis性能,反之,如果系统崩溃最近频率到当前的数据都会丢失。日志追加优点丢数据少缺点数据恢复靠日志回放,速度较慢。 文件较大,因为文件都是记录正删改命令,所以无法直接恢复数据,无法直接做冷备,需要手动加工脚本才能还原数据。详细说明参考如下转载文档:一、redis持久化----两种方式1、redis提供了两种持

2020-06-26 22:04:43 68

转载 Mysql 中 int(3) 和 int(11) 的区别

【1】int(3) 和 int(11)的区别(思维惯性认知错误)这里的3或11代表的是存储在数据库中的具体的长度,总以为int(3)只能存储3个长度的数字,int(11)只会存储11个长度的数字。【2】Mysql基础知识学习Mysql基本数据类型时,我们已知:从声明字段是int类型的那一刻起,int类型的字段就是占四个字节,一个字节8位,也就是4*8=32位。因此,可以表示的数字个数是2的32次方(2^32 = 4294 9672 96个数字)而4294 9672 96个数字也就是[

2020-06-26 09:44:33 311

原创 http详解

HTTP2.0和HTTP1.X相比的新特性 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连

2020-06-26 09:30:00 206

原创 TCP/UDP详解

TCP和UDP区别TCP靠谱 UDP不靠谱 面向连接 面向无连接 不丢包,不重复,按顺序到达 直接发,不问后果 面向字节流 面向数据包 拥堵控制 无拥塞控制 有状态服务 无状态服务 tcp面向连接,udp面向无连接。在互通之前,面向连接的协议会先建立连接,tcp会三次握手,而udp不会。 tcp提供可靠交付:通过tcp连接传输的数据,无差错,不丢失,不重复,并按序到达。而udp不保证不丢失,不保证按顺序到达。 TCP面向字节流。udp基于数

2020-06-26 08:49:30 637

转载 堆和栈的区别

一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的...

2020-06-25 22:22:52 66

原创 go等待一组协程结束的实现方式

waitGroupadd():产生每个goroutine时累加器加1。done():每个goroutine内部的完成销毁时减小计数。wait():等待所有add的goroutine都执行完,计数为0时触发。缓存channel不可保证顺序非缓存channel可以保证顺序package mainimport ( "fmt" _ "net/http/pprof" "time")//var wg sync.WaitGroupvar ch = make(chan

2020-06-25 17:58:40 548

原创 go协程泄露如何产生的、如何定位?

内存泄露概念如果你启动了一个 goroutine,但并没有符合预期的退出,直到程序结束,此goroutine才退出,这种情况就是 goroutine 泄露。当 goroutine 泄露发生时,该 goroutine 的栈(一般 2k 内存空间起)一直被占用不能释放,goroutine 里的函数在堆上申请的空间也不能被 垃圾回收器 回收。这样,在程序运行期间,内存占用持续升高,可用内存越来也少,最终将导致系统崩溃。GOROUTINE终止场景当一个goroutine完成它的工作 由于发生了没有处理

2020-06-25 15:41:59 3997

原创 go select 使用

select语句与通道怎样联用,应该注意些什么?select只能与channel通道联用,它由若干分支组成,每次执行这种语句的时候,一般只有一个分支中的代码会被运行。 分支分为两种分支:候选分支和默认分支,当所有候选分支都阻塞或者没有命中时候,就会走默认分支,如果没有默认分支,在所有候选分支都不命中时候,goroutine将会被阻塞,直到有一个候选分支被命中时候在唤起执行。 由于select语句是专为通道而设计的,所以每个case表达式中都只能包含操作通道的表达式,比如接收表达式。当然,如果我们需要

2020-06-25 12:17:26 541

原创 golang异常处理机制

error | panic | defer | recovererror错误panicpanic 能够改变程序的控制流,函数调用panic时会立刻停止执行函数的其他代码,并在执行结束后在当前Goroutine中递归执行调用方的延迟函数调用defer;recoverrecover可以中止panic造成的程序崩溃。它是一个只能在defer中发挥作用的函数,在其他作用域中调用不会发挥任何作用;现象panic 只会触发当前 Goroutine 的延迟defer函数调用; recov

2020-06-24 22:23:23 246

转载 Http中的8种方法,安全和幂等

HTTP/1.1 规定了八种方法,单词都必须是大写的形式1.GET:获取资源,可以理解为读取或者下载数据;2.HEAD:获取资源的元信息,即获取响应头。3.POST:向资源提交数据,相当于写入或上传数据;可以理解为新建(create)4.PUT:类似 POST;可以理解为更新,修改5.DELETE:删除资源;6.CONNECT:建立特殊的连接隧道;7.OPTIONS:列出可对资源实行的方法;8.TRACE:追踪请求 - 响应的传输路径。下面是总结:其实实际开发中掌

2020-06-23 10:35:42 533

转载 Golang三色标记、混合写屏障GC模式图文全分析

垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。​ Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,Golang进行了多次的迭代优化来解决这个问题。〇、内容提纲本文将系统的详细介绍Golang中GC的全分析过程,包括垃

2020-06-19 20:03:39 1178

原创 sync.Map

综述并发安全字典内部“通过大量的原子操作来尽量避免时使用锁”来保证并发安全的同时且性能更加。结构内部存储两个原生mapread只读字典:只读仅针对其key而言,key不允许增减,却允许改变所对应的值。而且对其值的操作是个原子操作的封装,无需加锁,尽量避免了使用锁。只读字典的操作都不需要加锁。dirty脏字典:脏字典和只读字典如果存在同一个键值对,那这两个key指向同一个值的指针。脏字典的操作都才需要加锁。misses 当穿透只读字典从脏字典中读取值的次数达到水位线时候,脏字典提升为只

2020-06-19 11:40:41 195

原创 go 协程切换时机

go异步并发模型MPG 模型阻塞 I/Oselect操作阻塞在channel等待锁主动调用 runtime.Gosched()

2020-05-28 20:47:38 1021

原创 条件变量

用途条件变量是基于互斥锁的一种同步工具,它必须有互斥锁(sync.Mutex/sync.RWMutex)的支撑才能发挥作用。 条件变量可以协调那些想要访问共享资源的线程。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程实例package mainimport ( "fmt" "sync" "time")func main() { // 邮箱 var ...

2020-02-09 18:47:59 152

原创 sync.Mutex与sync.RWMutex

竞态条件数据被多个线程共享,那么很可能就产生争用或者冲突,这种场景叫静态条件,这往往会破坏共享数据的一致性。同步方式避免多个线程在同一时刻操作同一个数据块。 协调多个线程,以避免它们在同一时刻执行同一个代码块。由于这样的数据块和代码块的背后都隐含着一种或多种资源(比如存储资源、计算资源、I/O 资源、网络资源等等),所以我们可以把它们看做是共享资源,或者说共享资源的代表。我们所说的...

2020-02-09 18:41:40 186

原创 错误处理

panic,recover,deferpackage mainimport "fmt"func div(i, j int) int { defer func() { if rc := recover(); rc != nil { fmt.Println("this is recover :", rc) } }() return i/j}func mai...

2020-01-30 19:47:58 138

原创 go语句及执行规则

协程概念MPG模型todo疑问package mainimport ( "fmt" "runtime" "time")func main() { fmt.Println("cup ",runtime.NumCPU()) for i := 0; i < 10; i++ { go func() { fmt.Println(i, &i) }...

2020-01-30 10:03:40 261

空空如也

空空如也

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

TA关注的人

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