获得徽章 0
#青训营 x 字节后端训练营# web工作流程
Web服务器的工作原理可以简单地归纳为
客户机通过TCP/IP协议建立到服务器的TCP连接
客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档
服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端
客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议
HTTP协议通常承载于TCP协议之上
展开
评论
#青训营 x 字节后端训练营# Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list(链表)、set(集合)、hash表等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
展开
评论
#青训营 x 字节后端训练营# TCP协议
TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网际协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。

TCP服务端
一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就创建一个goroutine去处理。

TCP服务端程序的处理流程:

1.监听端口
2.接收客户端请求建立链接
3.创建goroutine处理链接。
展开
评论
#青训营 x 字节后端训练营# Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list(链表)、set(集合)、hash表等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s ,单机能够达到15w qps,通常适合做缓存。

丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储有什么不同?

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
展开
评论
#青训营 x 字节后端训练营# 在 Go 的 `go-ldap` 包中,`NewSearchRequest` 是一个函数,用于创建一个新的 LDAP 搜索请求对象。该函数的签名如下:

```
goCopy codefunc NewSearchRequest(
baseDN string,
scope int,
derefAliases int,
sizeLimit int,
timeLimit int,
typesOnly bool,
filter string,
attributes []string,
controls []Control,
) *SearchRequest
```

参数解释如下:

- `baseDN`:字符串类型,表示搜索的基准 DN(Distinguished Name),即搜索的起始位置。

- ```
scope
```

:整数类型,表示搜索的范围。它可以是以下几种常量值之一:

- `ldap.ScopeBaseObject`:只搜索基准 DN。
- `ldap.ScopeSingleLevel`:搜索基准 DN 的直接子级。
- `ldap.ScopeWholeSubtree`:搜索基准 DN 的整个子树。

derefAliases

:整数类型,表示在搜索期间如何处理别名。它可以是以下几种常量值之一:
- `ldap.NeverDerefAliases`:不解析别名。
- `ldap.DerefInSearching`:在搜索过程中解析别名。
- `ldap.DerefFindingBaseObj`:解析别名,但在找到基准对象后停止。
- `ldap.DerefAlways`:始终解析别名。
- `sizeLimit`:整数类型,表示返回结果的最大条目数。设置为 0 表示没有限制。
- `timeLimit`:整数类型,表示搜索的时间限制(以秒为单位)。设置为 0 表示没有限制。
- `typesOnly`:布尔类型,表示是否只返回属性类型,而不返回属性值。
展开
评论
#青训营 x 字节后端训练营# mysql使用
使用第三方开源的mysql库: github.com/go-sql-driver/mysql (mysql驱动)
github.com/jmoiron/sqlx (基于mysql驱动的封装)

命令行输入 :

go get github.com/go-sql-driver/mysql
go get github.com/jmoiron/sqlx
链接mysql

database, err := sqlx.Open("mysql", "root:XXXX@tcp(127.0.0.1:3306)/test")
//database, err := sqlx.Open("数据库类型", "用户名:密码@tcp(地址:端口)/数据库名")
展开
评论
#青训营 x 字节后端训练营#
Golang Array和以往认知的数组有很大不同。

1. 数组:是同一种数据类型的固定长度的序列。
2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。
3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
for i := 0; i < len(a); i++ {
}
for index, v := range a {
}
5. 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic
6. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
7.支持 "=="、"!=" 操作符,因为内存总是被初始化过的。
8.指针数组 [n]*T,数组指针 *[n]T。
展开
评论
#青训营 x 字节后端训练营#
在Go语言中,io包提供了基本的I/O原语接口,其主要工作是封装这些原语的实现方式。在Go语言中,使用 Copy() 函数,从指定的源(src)复制到目标(dst),直到src达到EOF即文件结尾或抛出错误为止。当src由WriterTo接口实现时,copy调用src.WriteTo(dst)来实现;否则,如果dst由ReaderFrom接口实现,则copy调用dst.ReadFrom(src)来实现。此外,该函数在io包中定义,您需要导入“io”包才能使用这些函数。
展开
评论
#青训营 x 字节后端训练营# 时间操作
Add
我们在日常的编码过程中可能会遇到要求时间+时间间隔的需求,Go语言的时间对象有提供Add方法如下:

func (t Time) Add(d Duration) Time
举个例子,求一个小时之后的时间:

func main() {
now := time.Now()
later := now.Add(time.Hour) // 当前时间加1小时后的时间
fmt.Println(later)
}
Sub
求两个时间之间的差值:

func (t Time) Sub(u Time) Duration
返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

Equal
func (t Time) Equal(u Time) bool
判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。本方法和用t==u不同,这种方法还会比较地点和时区信息。

Before
func (t Time) Before(u Time) bool
如果t代表的时间点在u之前,返回真;否则返回假。

After
func (t Time) After(u Time) bool
如果t代表的时间点在u之后,返回真;否则返回假。
展开
评论
#青训营 x 字节后端训练营# 时间间隔
time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年。

time包中定义的时间间隔类型的常量如下:

const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
例如:time.Duration表示1纳秒,time.Second表示1秒。
展开
评论
下一页
个人成就
文章被阅读 396
掘力值 71
收藏集
3
关注标签
41
加入于