自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 http与https

http和https协议的区别一个故事看懂HTTPS 深入理解Https如何保证通信安全我是这样理解HTTP和HTTPS区别的 - Jesse131 - 博客园http数据是直接通过tcp发送的, 一切数据都是明文的,不能保证数据的有效性和完整性(比如代理就能进行劫持、篡改、窃听、伪造等)。https数据是先发送到ssl层进行加密再由ssl层通过tcp发送的, 能确保数据的安全性,但是效率会比http差一点(加密那些本身需要使用资源)。https演化过程 :一、对称加密流程:

2021-12-08 19:51:03 316 1

原创 分布式锁总结

分布式锁的使用场景:当我们在面对多个进程使用(一般是先读后改)共享内存这种并发场景时,因为读和写是两个操作,不能保证原子性, 所以需要借助外界的“锁”来将这两个操作锁起来保证原子性。如果是单机的话, 可以使用系统或语言层面提供的锁来解决。 但是如果处于分布式环境中呢?多台机器没有共享内存可用, 如果保证?我们抽象一下, 可以把这个问题变成如何在分布式环境下保证同一时刻我在做某事的时候别人不能做,只有等我做完了他才能做。这个时候我们可以参考系统或语言层面锁的设计来设计自己的锁。把锁作为独立于各

2021-12-07 09:51:58 1517

原创 消息队列总结

消息队列核心作用:将数据保存到一个中转点,设计实现参考各种快递站点。使用场景 : 异步、削峰、 解耦。核心功能:上传数据、保存数据、获取数据。涉及到的角色 : 生产者、消息队列服务、消费者。主要工作流程:生产者上传数据到消息队列服务,消息队列服务保存数据,消费者获取消息队列服务保存的数据。需要解决的问题 :1、生产者怎么上传数据?涉及到通信协议、消息路由、消息编码、怎么界定成功还是失败(做的不好会丢失消息)?2、消息队列服务怎么保存数据?存到内存还是存到磁盘?存多久?怎么保证

2021-12-04 08:45:45 1933

原创 mysql 索引失效

关于mysql 索引失效 :1、索引列不独立 –> 指被索引的这一列不能是表达式的一部分, 不能是函数的参数。如下 :select id,name,age,salary from table_name where salary + 1000 = 6000;其中索引列 salary 被用来做加法运算。select id,name,age,salary from table_name where substring(name,1,3)= 'luc';其中索引列被放在函数中用来做运算。

2021-12-01 19:37:33 421

原创 微服务关于 proto 导入包的问题

关于 proto 导入包的问题:1、proto_path 指定所有 import 的根路径,比如我编译的命令为 :protoc --proto_path=/home/go/src:. --govalidators_out=Mproto/imports/api.proto=github.com/micro/go-micro/v2/api/proto:./gen-go --micro_out=Mproto/imports/api.proto=github.com/micro/go-micro/v2/

2021-10-12 17:58:08 917

原创 分布式事务

分布式事务什么是事务, 有哪些特性?事务是指 访问并可能更新数据库中各种数据项的一个【程序执行单元】。事务有原子性、一致性、隔离性、持久性四大特性。原子性 : 事务中包含的操作是不可分割的, 要么都做,要么都不做。一致性: 使数据库从一个一致性状态变到另一个一致性状态。(保证多条DML语句同时成功或者同时失败。比如转账,要么转成功, 要么转失败)。隔离性:多个事务间具有隔离,同时进行互不影响。持久性:最终数据必须持久化到硬盘文件。原子性 : 强调整个事务不可分割。一致性

2021-09-21 16:13:09 93

原创 mysql隔离性与MVCC

一、隔离性的定义隔离性指多个事务间具有隔离,同时进行互不影响。 -- 在解决并发读写的问题二、并发读写数据库存在的问题1、脏读:A事务读到了B事务没有提交的数据(这条数据可能被回滚,导致A事务跟着出错)。2、不可重复读:A事务第一次读取某条数据后,B事务对该数据做了修改,A事务再去读这条数据的时候发现跟上次读取的结果不一样。3、幻读:A事务读取某范围内的数据并做了修改,此时B事务在这个范围内增加了新数据,A事务再去读取该范围内数据时发现某些数据没有被修改(好像出现幻觉)。三、

2021-09-21 14:00:24 230

原创 http1.0、http1.1、http2.0、protobuf、grpc

一、http1.0、http1.1、http2.0的区别传输方面http1.0 : 每次请求都需要建立一个新的tcp连接, 所以每次请求都需要经历tcp的三次握手四次挥手。 如果是同一个客户端发起的请求,完全不需要每次建立连接。http1.1: 保持首次建立的那个tcp连接, 知道被通知关闭才关闭连接。这样就解决了http1.0中多次建立连接的问题。 但是http1.1的消息需要一个一个请求、响应, 如果第一个请求在服务端被阻塞了, 那么第二个请求也不会被处理, 直到第一个请求被处理完...

2021-09-14 22:21:47 1200

原创 go函数栈帧

程序在编译的时候, 得到的可执行文件分为代码段(机器指令)和数据段。程序运行时会分配虚拟内存, 将代码段和数据段都加载到虚拟内存中, CPU去代码段读取一条条的机器指令来执行。 我们的函数里面的指令就存在代码段中(有个函数名)。 当我们调用一个函数的时候, 其实会触发一个call指令, 引导CPU去该函数名对应的机器指令地址去指向函数体。 我们最后被调用的函数里面使用的内存资源总是需要最先被释放掉的(他里面的局部变量等其他函数用不了)。 所以使用栈来给函数分配变量,所谓的先进后出, 是以函数为单位的..

2021-09-11 00:22:15 360

原创 Go内存管理

Go内存管理一、虚拟内存是什么?为什么会有虚拟内存?操作系统管理内存的机制——为什么要设置虚拟内存? - wj_hubei - 博客园如何理解虚拟内存 - 知乎总结如下 :使用虚拟内存和不使用虚拟内存的区别 :使用虚拟内存后程序只能访问属于自己的内存地址, 避免进程数据被其他进程修改。 程序直接使用的内存地址(虚拟内存地址)是确定的(大家都是从0x00000000 开始), 然后通过页表将这些地址映射到内存中一个不确定的地址中。 在管理内存的时候不使用虚拟内存需要把整个程序作

2021-09-10 20:38:36 430

原创 mysql锁

参考 https://www.cnblogs.com/yaochunhui/p/14186371.htmlhttps://www.cnblogs.com/tutar/p/5878651.html锁的作用Mysql中锁主要用来保障线程在并发读写数据的时候数据的安全性的。他其实跟操作系统中的锁本质差不多, 只是增加了业务特性。操作系统中锁的种类锁细分的话可以分为 :共享锁 : 其他事务可以读,但不能写。排它锁 : 其他事务不能读,也不能写。意向共享锁 :...

2021-08-25 16:19:47 213

原创 mysql事务、mvcc

MVCC :参考https://blog.csdn.net/SnailMann/article/details/94724197Mvcc 指的是 多版本并发控制, 主要用来避免在并发情况下写操作对读操作的阻塞。减少锁的使用进而提高并发能力。MVCC 就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读。当前读实际上是一种加锁的操作,是悲观锁的实现MVCC主要依赖于 记录中的 3个隐式字段,undo日志 ,Read View 这三个部分来实现的。一、undol..

2021-08-23 16:43:26 122

原创 mysql组件及查询流程、索引原理

mysql的内部组件构成如下 :客户端首先通过连接器(默认3306端口)与mysql服务器建立连接,连接器将数据库中客户端使用的用户的权限相关的表在连接建立时加载到内存中, 然后通过内存中的权限校验用户的身份、各种操作权限。客户端在提交各种sql语句并且权限校验通过之后, 如果是查询, 先查询缓存区(内存中)是否有缓存(sql语句为key, 查询结果为value, 这个在后续的版本中被移除了)。没查到则进入 词法分析器 中, 词法分析器对语句的合法性 等做出校验, 然后再将分析后的sql

2021-08-22 23:19:48 610

原创 go interface

Interface 底层有两种实现方式:一种是不包含任何方法的空接口, 底层为 efface , 我们常将另外一个变量赋值给他, 把他当作“任意类型”来使用, 这种情况下他不包含任何方法。源码如下 :type iface struct { _type *_type data unsafe.Pointer}另一种是 包含方法的 iface ,他包含一组方法, 也可能包含其他接口, 我们常用它来做面向对象编程。源码如下 :typ...

2021-08-20 23:47:00 137

原创 redis是单线程还是多线程?

redis是单线程还是多线程?首先要搞懂redis中的事件。Redis中包含两类事件 :1、文件事件 : redis服务器通过套接字与客户端进行连接, 而文件事件就是服务器对套接字的抽象。服务器与客户端的通信会产生对应的文件事件,而服务器通过监听并处理这些事件来完成一系列网络通信操作。(说白了就是客户端的各种增删改查、设置配置等操作)。2、时间事件:服务器对定时任务的抽象(比如过期清理、持久化等)。其中文件事件既然是对各种网络事件的处理, 自然需要先进行网络连接, 然后通过这个连接传入..

2021-08-19 11:10:32 209

原创 go语言锁机制

根据极客课堂晁岳攀 老师的《Go 并发编程实战课》总结而来锁是什么 :在操作系统层面, 多个线程在操作一块共享内存的时候, 需要先获取原来的数据, 然后进行修改。这一个过程存在两个步骤, 为了保证这两个操作的原子性, 需要对这个操作“上锁” 。linux中的锁其实也是一个在共享内存中的变量, 所有线程在要执行 “修改共享内存“ 的代码(临界区)的时候,都需要对这段代码进行加锁。相当于先获取一个全局变量,看他的值是0还是1, 如果是1表示这个 锁 已经被其他线程获取到了,自己需要等他变成0.

2021-08-17 21:52:03 3808

原创 进程、线程、协程

一、什么是进程?通俗来说, 进程可以理解为 运行着的程序。我们需要运行一个程序, 总是要有条件的。常见的编程语言分为 编译型语言 和 解释型语言 。编译型语言写出来的程序最终得到的程序是一个二进制可执行文件, 里面包含 数据段(定义的各种变量) 和 代码段(非变量部分) 。代码段里面放的是cpu可以直接执行的机器指令。解释型语言写出来的程序需要依赖解析器来执行。 解析器一般是一个C/C++写的可执行文件,解析器可以被cpu直接执行。 我们写的代码再被解析器读取、解析, 最后才被解析...

2021-08-14 20:58:25 391

原创 redis常用数据结构解析

Redis底层数据结构 :字符串SDS :struct sdshdr {// 记录buf数组中已使用的字节的数量// 等于SDS所保存字符串的长度int len;// 记录buf数组中未使用的字节的数量int free;// 字节数组,用于保存字符串char[] buf;};为什么不直接使用C中的字符串?如果需要计算字符串长度,C中的字符串需要遍历字节数组,而SDS直接通过len字段得到。 更方便检测...

2021-05-11 23:46:16 362 1

原创 kafka与rabbitMQ

一、kafka架构:1、结构名词解释:1)Producer :消息生产者,就是向kafka broker发消息的客户端;2)Consumer :消息消费者,向kafka broker取消息的客户端;3)Topic :可以理解为一个队列;4) Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念.

2021-05-08 21:09:48 13889 6

原创 常见cpu性能优化方法

平均负载平均负载指 单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps aux 命令看到的,处于 R 状态(Running 或 Runnable)的进程。不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps aux 命令中看到的 D 状态(Uninte

2021-04-11 15:09:09 5722

原创 Prometheus(普罗米修斯)架构及原理

prometheus架构图:如上,prometheus 采集数据的主要方式是 server 通过http请求去“主动拉取”数据。要完成以上需求, 必须满足以下条件 :server必须知道各种 exporter 的api 地址。 各种 exporter 的api 必须返回统一的、 规范的数据,server才能解析、存储各种监控数据。满足以上两点需求后server才能和exporter解耦。 只要遵循规范, 可以根据需求开发出各种 exporter (比如专门采集redis数...

2021-03-31 20:39:50 8063 1

原创 记一次上线前接口优化

记一次上线前接口优化

2021-03-30 19:57:33 235

原创 各类消息队列

消息队列的定位本质上还是一个队列, 用于存放进程间通信的一些消息(可以想象成一个保管室,甲有东西要给乙,但是乙此时不一定有时间马上去拿, 便跟甲约定, 你把东西放到 xxx 保管室, 我有时间的时候直接去xxx保管室拿)。消息队列就是这个“保管室”, 最简单的需求:生产者产生消息之后存储在消息队列里面, 消费者去消息队列获取消息进行处理。伴随着这个简单的需求使用频率和场景越来越多, 衍生出来的消息队列种类和所侧重的其他功能也越来越多(比如消息怎么存储,产生和消费消息时使用什么协议,怎么解决消息消费失败问

2021-03-28 17:47:45 268 1

原创 项目进度规划-甘特图

一、什么是甘特图(百度百科描述)根据图片整理出用得到的点如下 :以图示通过活动列表和时间刻度表示出特定项目的顺序与持续时间。一条线条图,横轴表示时间,纵轴表示项目,线条表示期间计划和实际完成情况。以作业排序为目的,将活动与时间联系起来。二、实践以某文件分发系统为例:场景:该文件分发系统包含以下模块:1、客户端:文件上传工具, 内部使用, 获取需要上传的文件列表并上传文件。2、文件上传服务端:保存客户端上传的文件,并将文件上传结果等记录到数据库。3、文件分发系统:拉..

2021-03-27 15:35:57 13048 2

转载 什么是通信原理?原来这么简单

什么是通信(Communication)?简单来说,通信就是传递信息。我把我的信息发给你,你把你的信息发给我,这就是通信。通信的官方定义更加严谨一些——人与人,或人与自然之间,通过某种行为或媒介,进行的信息交流与传递,叫做通信。也就是说,通信不仅限于人类之间的信息交换,也包括自然万物。更多来自 :https://network.51cto.com/art/201903/593406.htm...

2021-03-26 09:04:19 1721

原创 关于web架构的一些理解

关于web架构的一些个人看法

2021-03-21 20:19:04 228 2

原创 大型网站技术架构核心原理与案例分析笔记

大型网站技术架构核心原理与案例分析笔记网站的演化历史 :【考虑到可用性, 下面每一步都可以做主备】一、小型网站 : lamp (linux apache mysql php), 将所有东西都部署在单台机器上。应用程序的开发越快越好, 可以选择 php 、 django 等。不一定需要 redis 等缓存, 但是数据库是必须的。代理的话如果语言层面框架有实现好的代理可以不使用 apache 等代理。所以最简单的网站可能是这样的 :在一台 linux 服务器里面...

2021-03-21 14:44:44 181 3

转载 分布式架构的前世今生

一、前言​随着社会的发展,技术的进步,以前的大型机架构很显然由于高成本、难维护等原因渐渐地变得不再那么主流了,替代它的就是当下最火的分布式架构,从大型机到分布式,经历了好几个阶段,我们弄明白各个阶段的架构,才能更好地理解和体会分布式架构的好处,那么本文我们就来聊聊分布式架构的演进过程,希望能给大家带来眼前一亮的感觉。二、背景说明​我们都知道一个成熟的大型网站的系统架构并非一开始就设计的非常完美,也没有一开始就具备高性能、高并发、高可用、安全性等特性,而是随着用户量的增加、业务功能的扩展逐步演变过

2021-03-21 14:40:40 134

转载 常用30种SQL查询语句优化方法

1、应尽量【避免在 where 子句中使用】【!=或<>操作符】,【否则引擎将放弃使用索引】而【进行全表扫描】。2、对查询进行优化,应【尽量避免全表扫描】,首先应【考虑在 where 及 order by 涉及的列上】【建立索引】。3、【应尽量避免在 where 子句中】对【字段进行 null 值判断】,【否则将导】致引擎放弃使用索引而进行【全表扫描】,如:select id from t where num is null【可以在num上设置默认值0,确保表中num..

2021-03-18 22:13:11 645

原创 数据库文件

数据库由 存储在 硬件设备上的信息组成。而 mysql 、sqlist 等只是数据库系统, 在 数据库 使用者 和 储存在 硬件上面的 数据之间建立联系的桥梁。最终, 我们存储在数据库里面的信息会以 文件(或内存)的形式展示在操作系统上。如 Ubuntu16.04 , 通过 mysql 中的配置文件/etc/mysql/mysql.conf.d/mysqld.cnf , 可以看到数据存储在哪里 。即 datadir 对应的目录。进入 该 目录会看到其中每个【目录】【对

2021-03-18 22:06:49 3162

原创 单台Mysql 工作原理

首先我们需要知道的是, mysql 数据库存储数据的时候, 数据最终是存储在硬件设备上的,最终转换为 0101... 这种数字电路里面的高低电平放在一个个门电路里面,这些门电路组成一个个小的电子元器件。以此来记录数据。而在软件系统(如linux)看到的表现形式为 一个个 加密过的文件。所以, 最终我们使用数据库存储数据就可以认为是把我们的数据通过特定的方式记录到文件里面。从数据库读取数据就是从这些文件读取数据后通过特定方式还原成我们之前存进去的格式。如上图就是 mysql 数据库

2021-03-18 22:03:35 100

原创 关于RPC与gRPC

关于 RPC :RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。用于用于服务间调用的协议 。(一种供大家遵循的规范, 与restful一样没有实际的东西, 只是一种约定或者说规范)设计的目的:实现函数调用模式的网络化。让客户端就像调用本地函数一样调用远程机器上的函数,然后客户端把这些参数打包之后通过网络传递到服务端,服务端解包到处理过程中执行,然后执行的...

2021-03-18 21:07:25 414

原创 go语言常用数据结构之 channel

https://www.toutiao.com/i6862487725497876995/?tt_from=copy_link&utm_campaign=client_share×tamp=1615296896&app=news_article&utm_source=copy_link&utm_medium=toutiao_android&use_new_style=1&req_id=20210309213455010212061194550F590C&amp

2021-03-17 09:38:33 656

原创 go语言常用数据结构之map

go 数据结构maphttps://www.cnblogs.com/maji233/p/11070853.html要理解 map , 先要理解哈希表https://blog.csdn.net/gqtcgq/article/details/45289419哈希是一类算法(映射算法,有很多种),类似一元一次方程那种,比如取余。而哈希表的结构一种实现方式是一种存储链表的数组。首先他提供哈希函数创建数组(比如哈希算法是对7取余,则创建一个长度为7的存储链表的数组)。当有数据需要存储的时候

2021-03-16 21:16:18 629

原创 go语言GC内存回收

https://zhuanlan.zhihu.com/p/264789260垃圾回收原理:什么是GC?写过C/C++的应该了解 malloc 和 free 这两个函数, 用来手动申请内存和释放内存, 如果申请了内存但是没有去释放, 则会导致内存泄露。但是我们用python、php、go写代码的时候却重来没有去分配、释放过内存,也没关注过,却没有造成内存泄露, 这是为什么呢?因为他们使用自动的内存管理系统,有内存分配器和垃圾收集器来代为分配和回收内存,其中【垃圾收集器】就是我们常说的GC。G

2021-03-16 21:14:25 609

原创 刨根问底HTTP与WebSocket的关系总结

《WebSocket详解(一):初步认识WebSocket技术》《WebSocket详解(二):技术原理、代码演示和应用案例》 《WebSocket详解(三):深入WebSocket通信协议细节》 《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》 《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》 《WebSocket详解(六):刨根问底WebSocket与Socket的关系》有了http、tcp为什么还需要 websocke

2021-03-16 21:11:56 421

原创 快速读懂Http3协议总结

《网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!》什么是 http3当IETF正式标准化HTTP/2时,Google正在独立构建一个新的传输协议,名为gQUIC。它后来成为新互联网草案,并被命名为QUIC。gQUIC最初的实验证明,在网络条件较差的情况下,gQUIC在增强网页浏览体验方面的效果非常好。因此,gQUIC的发展势头越来越好,IETF的大多数成员赞成建立一个在QUIC上运行的HTTP新规范。这个新的倡议被称为HTTP/3,以区别于当前的HTTP/2标准。从语法和语义上看

2021-03-16 21:10:44 769

原创 深入浅出,全面理解HTTP协议总结

《网络编程懒人入门(七):深入浅出,全面理解HTTP协议》思维导图:http请求过程如下 :首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求;接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层;在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了;接收端的服务器在链路层接收

2021-03-16 21:10:07 104

原创 集线器、交换机、路由器功能原理入门总结

《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》1、集线器用于充当一个桥梁,将多台机器连接起来(以广播的方式)。2、交换机用于在多台机器提供集线器进行通信的时候进行定向传输数据(避免广播)。3、路由器用于将多个局域网连接起来。如图,小C给小乙发生数据的时候,小C先将数据发生到A村的交换机,交换机再将数据发送到路由器A, 路由器A再将数据发送到路由器B,路由器B再将数据发送到B村的交换机, B村的交换机最终将数据发送给小乙。小C -> A村交换机 -&gt

2021-03-16 21:09:30 1164

原创 快速理解TCP和UDP的差异总结

《网络编程懒人入门(四):快速理解TCP和UDP的差异》比较这两个,首先我们要比较他们的报文格式,进而分析他们的特点。TCP首部 :UDP首部:如上图,网络层要实现的目的是在两台机器能相互通信的前提下, 定位到是机器上的哪两个程序在进行通信, 而定位机器上的程序的方式是通过端口号实现的(每个端口只能被一个程序占用)。所以TCP和UDP都添加了源端口号和目的端口号进去。但是可以看到TCP头的信息要比UDP多得多,那么多出来的这部分信息是用来干嘛的呢?这个就涉及到丢包, 如果u

2021-03-16 21:08:55 250

空空如也

空空如也

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

TA关注的人

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