系列文章目录
计算机相关知识文档
文章目录
前言
本文设计计算机相关知识比较广,供个人学习使用,其中很多内容摘自其他文章,有些没有标记出来,若有侵权可联系本人马上删除。
一、http协议post请求和get请求的区别
请求参数:GET请求参数是通过URL传递的,多个参数以&连接,POST请求放在request body中。
请求缓存:GET请求会被缓存,而POST请求不会,除非手动设置。
收藏为书签:GET请求支持,POST请求不支持。
安全性:POST比GET安全,GET请求在浏览器回退时是无害的,而POST会再次请求。
历史记录:GET请求参数会被完整保留在浏览历史记录里,而POST中的参数不会被保留。
编码方式:GET请求只能进行url编码,而POST支持多种编码方式。
对参数的数据类型:GET只接受ASCII字符,而POST没有限制。
请求参数长度限制:在HTTP协议中没有对URL长度进行限制,这个限制是不同的浏览器及服务器由于有不同的规范而带来的限制。
GET请求的request body:GET可以带request body,但不能保证一定能被接收到。
二、http常用状态码
- 相应类别由以下五种:
状态码 | 类别 | 描述 |
---|---|---|
1xx | Informational | (信息状态码) |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要附加操作已完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
- 14种常用的HTTP状态码列表
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
200 | OK | 请求成功。一般用于GET与POST请求 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
206 | Partial Content | 是对资源某一部分的请求,服务器成功处理了部分GET请求,响应报文中包含由Content-Range指定范围的实体内容。 |
301 | Moved Permanently | 永久性重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时性重定向。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与302类似。使用GET请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向,会按照浏览器标准,不会从POST变成GET。 |
400 | Bad Request | 客户端请求报文中存在语法错误,服务器无法理解。浏览器会像200 OK一样对待该状态吗 |
401 | Unauthorized | 请求要求用户的身份认证,通过HTTP认证(BASIC认证,DIGEST认证)的认证信息,若之前已进行过一次请求,则表示用户认证失败 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面。也可以在服务器拒绝请求且不想说明理由时使用 |
500 | Internal Server Error | 服务器内部错误,无法完成请求,也可能是web应用存在bug或某些临时故障 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
三、golang 相关
四种数据类型
- 基本类型:整型(int/uint/int8/uint8/int16/uint16/int32/uint32/int64/uint64/byte/rune等)、浮点数(float32/float64)、复数类型(complex64/complex128)、字符串(string)。
- 复合类型(又叫聚合类型):数组和结构体类型。
- 引用类型:切片(slice)、map、channel、指针。
- 接口类型:如error。
tips:
1.go语言中数据类型没有隐式转换
2.浮点数不能精确表示,浮点运算结果会有误差,所以尽量不要做浮点数比较
3.slice和map不能用==比较
goroutine协程
- 一个进程的一个协程panic了,整个进程都会终止
go语言中 channel 发生panic场景
- 往已经关闭的channel里写数据
- 关闭已经关闭的channel
- 从初始化未赋值的channel里读数据
tips:go语言可以从已经关闭的channel里读数据
go语言中string类型
- 默认值为空字符串
- 可以使用for循环遍历
- 可以使用下标读取每一位字符
- 不可以根据下标更改指定字符
go语言中map类型
- 不可以并发读取map,需要加锁
- 从map里读取不存在的key不会panic,会返回map中value的默认值
- map的输出是无序的
- map只有len操作,没有cap操作
for range 循环次数
- 循环次数在函数一开始编译时就已经确定,不会随着循环的执行而动态更改循环次数
接口interface
- interface接口方式实现比较隐性,任何类型的对象实现interface所包含的全部方法,则表明该类型实现了该接口
- 空接口interface{}还可以作为一种通用的类型,其他类型变量可以给interface声明的变量赋值
- 一个接口可以继承多个其他接口
go语言struct结构体
- 同一个struct的两个实例可比较也不可比较,当结构不包含不可直接比较成员变量(Slice,Map,Function)时可直接比较,否则不可直接比较
- 通过赋值语句对结构体的拷贝,是浅拷贝,如果struct属性中有引用类型的话,复制的是指针,而不是具体的值。
- struct是值传递的
内存管理
相关介绍链接: Go内存分配
层级
Page < Span < mcache < mcentral < mheap
tips:TCMalloc是Thread Cache Malloc的简称,是Go内存管理的起源
内存泄露
相关介绍链接: Go内存泄露
- 内存泄露指的是程序运行过程中已不再使用的内存,没有被释放掉,导致这些内存无法被使用,直到程序结束这些内存才被释放的问题。
- Go虽然有GC来回收不再使用的堆内存,但这并不意味着Go程序不再有内存泄露问题。
- 在Go中发现内存泄露有2种方法,一个是通用的监控工具,另一个是go pprof:
- 监控工具:固定周期对进程的内存占用情况进行采样,数据可视化后,根据内存占用走势(持续上升),很容易发现是否发生内存泄露。
- go pprof:适合没有监控工具的情况,使用Go提供的pprof工具判断是否发生内存泄露。
内存逃逸
相关介绍链接: go的内存逃逸
- 概念:当函数要返回一个局部变量地址的时候,我就说这个变量(这块内存)想要逃逸,这就是内存逃逸。
- go的编译器,在编译的时候会做逃逸分析,分析这个变量(这块内存)是否想要逃逸。逃逸,则在堆上分配内存;否则在栈上分配内存。
- go 中的接口类型的方法调用是动态调度,因此不能够在编译阶段确定,所有类型结构转换成接口的过程会涉及到内存逃逸的情况发生,应该尽量避免使用接口类型。
- 堆上分配内存比在栈上分配内存,开销大的多
- go的内存逃逸是在编译期间完成
- Go编译器会在编译期对考察变量的作用域,并作一系列检查。简单来说,编译器会根据变量是否被外部引用来决定是否逃逸。
- 不要盲目使用变量的指针作为函数参数,虽然它会减少复制操作。但其实当参数为变量自身的时候,复制是在栈上完成的操作,开销远比变量逃逸后动态地在堆上分配内存少的多。
四、数据相关
json 数据类型
类型 | 描述 |
---|---|
数字型(Number) | JavaScript 中的双精度浮点型格式 |
字符串型(String) | 双引号包裹的 Unicode 字符和反斜杠转义字符 |
布尔型(Boolean) | true 或 false |
数组(Array) | 有序的值序列 |
值(Value) | 可以是字符串,数字,true 或 false,null 等等 |
对象(Object) | 无序的键:值对集合 |
空格(Whitespace) | 可用于任意符号对之间 |
null | 空 |
tips:
1.json中不存在map数据类型
2.json的key只能是string类型
3.json中的数字类型转换到go语言中为float64类型
4.在go语言中omitempty表示如果字段是空值,转换成的json忽略该字段
yaml文件(Ain’t Markup Language)
yaml详细文档: YAML 语言教程.
1. 语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
2. 支持的数据结构
- 对象:键值对的集合,又称为映射(mapping)、 哈希(hashes)、字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence)、 列表(list)
- 纯量(scalars):单个的、不可再分的值:字符串、布尔值、整数、浮点数、Null、时间、日期
ini文件
1.文件结构 :由节、键、值组成。
[Section1]
KeyWord1 = Valuel
KeyWord2 = Value2
……
[Section2]
KeyWord3 = Value3
KeyWord4 = Value4
2.特点:结构简单但是不能表现层级结构
protobuf数据类型
五、redis相关
1.redis过期键的策略
Redis的过期删除策略:惰性删除和定期删除两种策略配合使用。
惰性删除:由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。
定期删除:由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
2.redis事务机制
- 将多个命令请求打包,然后一次性、按顺序性地执行多个命令
- 一个事务从开始到结束经历三个阶段:事务开始、命令入队、事务执行
- 事务操作:开始(MULTI)、取消(DISCARD)、执行(EXEC)、监视(WATCH)服务器会立即执行从客户端传来的这四个命令
- WATCH 命令用于监视任意数量的数据库键,并在EXEC命令执行时,检测被监视的键是否被修改,如果被修改了,服务器将拒绝执行事务,并向客户端返回空回复。
- Redis事务不支持回滚机制。
3.redis锁并发处理
相关介绍链接: redis锁处理并发问题
- 生成uuid,setNx设置锁,解锁时校验uuid
- 使用getset命令,getset设置键值,并返回原来的键值。 setnx(lock, 时间戳+超时时间)
4.zset底层数据结构
zset底层的存储结构包括ziplist或skiplist
相关介绍链接: redis zset底层数据结构
- 在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:
- 有序集合保存的元素数量小于128个
- 有序集合保存的所有元素的长度小于64字节
- 当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
- 当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。
5. pipeline管道命令
- 把一组命令进行打包,然后一次性通过网络发送到Redis。(官方的推荐是以 10k 每批)
- 不保证原子性,如果要求原子性的,不推荐使用 pipeline。
- 第一次存string类型数据时会预分配冗余空间的方式来减少内存的频繁分配。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间
六、MongoDB相关
- 索引使用B树
- 使用insert方法,如果待插入的集合不存在,则插入操作会默认创建集合。
- 属于NoSQL
七、算法
寻路算法
- 广度优先算法
- Dijkstra
- A star(A *)
- Greed-Best-First-Search
- bellman-ford
排序算法
- 基于比较的排序算法时间复杂度理论极限是O(N*log(N))
八、WebSocket
- ws(WebSocket) 和wss(WebSocket Secure) 为两个标识符方案,分别用于未加密和加密连接。
- 是一种长链接,建立连接后,客户端和服务器可以以全双工模式来回发送 WebSocket 数据或文本帧。
- WebSocket 与HTTP不同。这两种协议都位于OSI 模型的第 7 层,并依赖于第 4 层的 TCP。
九、golang相关框架
gRPC
- 客户端调用server端提供的接口就像是调用本地的函数一样
- 使用http2.0作为底层的传输协议
- 使用protobuf作为传输数据的协议,大幅减少需要传输的数据量
- 适合服务器之间的通信
- 采用双向流式处理
go mock
- 全局变量可通过GoStub框架打桩
- 过程可通过GoStub框架打桩
- 函数可通过GoStub框架打桩
- interface可通过GoMock框架打桩
- 使用GoStub框架完成mock对象的注入
十、GitHub 使用
- rebase合并多次提交记录
- git reset 回退到之前提交的版本
- clone时所有分支均被克隆,但默认切到HEAD指向的分支
- 克隆出的工作区中执行 git log、git status、git checkout、git commit等操作不会去访问远程版本库