Go 并发模型介绍

Go中高效的并发得益于GPM这个并发模型使用Goroutinue并发的运行多个任务

Redis

redis事务

Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis的最小执行单元,一个事务中的命令要么都执行,要么都不执行。

使用MUUTI开始一个事务,然后把所有要在同一个事务中执行的命令都发送给 Redis后,我们使用EXEC命令告诉Redis将等待执行的事务队列中的所有命令(开始事务后,每一台输入命令都返回QUEUED的命令)按照发送顺序依次执行。命令在执行EXEC后才依次执行。
Redis保证一个事务中的所有命令要么都执行要么都不执行。如果在发送EXEC命令前客户端短线,则Redis会清空事务队列,事务中的命令都不会执行。
Redis事务保证在一个事务内的命令依次执行的过程中而不被其他命令插入

Http如何保证数据可靠及HTTP2的简单介绍

HTTP 的 Keep-Alive模式

当使用普通模式时,即非KeepAlive模式时,每个请求/应答都需要新建一个连接,数据传输完成后立即断开连接;当使用Keep-Alive模式时,这个模式时客户端和服务端的连接是在数据传输完成后是不中断的,当后续又有请求时,可以复用连接

如何判断请求所得到的响应数据已经接受完成 - 使用消息首部字段Conent-Length
表示实体内容长度,客户端可以根据这个值来判断数据是否接受完成 - 使用消息首部字段Transfer-Encoding
在传输一些动态页面时,服务器是与现实不知道内容大小,这时就可以使用Transfer-Encoding: chunk模式来传输数据。即如果要一边生产数据,一边发送数据给请求端,就要使用Transfer-Encoding:chunked这样的方式来代替Conteng-Length。chunk编码将数据分为一块一块的发生。Chunked编码将使用若干个Chunk串连而成,由一个标明长度为0的chunk标识结束。

Golang的interface的原理

iface 和 eface 都是 Go 中描述接口的底层结构体,区别在于 iface 描述的接口包含方法,而 eface 则是不包含任何方法的空接口:interface{}

Golang的sync包的几个常用的功能

学习下sync包的几个常用的包的使用和使用方法

Go语言中的单例模式

比较golang实现的几种单例模式的写法的优缺点

golang sql连接池由于设置空间连接比较少最大连接数太多导致的Time Wait

在golang sql连接请求的时候,遇到了大量time wait的情况,导致服务不可用,最后排查是因为空闲连接数太少的缘故,这篇主要来分析下sql 连接池的建立和释放的过程

Gin http请求过程

使用Go后,对Go的web框架gin使用的比较多,这篇文章主要介绍下Gin这个web框架

Raft一致性算法

Raft将一致性算法分解成了几个关键模块 - 领导人选举 一个新的领导人需要被选举出来,当现存的领导人宕机的时候 - 日志复制 领导人必须从客户端接收日志然后复制到集群中的其他节点,并且强制要求其他节点的日志保持和自已相同 - 安全性 在Raft中安全性的关键是状态机安全:如果有任何的服务器节点已经应用了一个确定的日志条目到他的状态机中,那么其他服务器节点不能在同一个日志索引位置应用一个不同的指令

Mysql基础概念

并发控制

读写锁

在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫做读锁(read lock)和写锁(write lock)

  • 读锁 共享的,互相不阻塞的。多个客户在同一时刻可以同时读取同一个资源,而互不干扰。
  • 写锁 写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁。

这是出于安全的考虑吧,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。