Wanmii's Blog.

Wanmii's Blog.

May you always remember how precious you are.

[DB]多类型数据库基础
常用数据库 MySQL 分布式关系型数据库 作为一个独立的数据库服务器,应用程序需要与MySQL守护进程通信才能访问数据库 无全文本搜索 PostgreSQL 对象关系型数据库 支持面向对象及关系型数据库功能 并发性能好 SQLite 嵌入式关系型数据库 并不作为一个独立的进程通过某种通信协议与应用程序通信,而是作为应用程序的一部分 自包含、基于文件存储 同一时刻仅允许一个写操作 Elastic 全文搜索引擎 本质上是一个分布式数据库(NoSQL) Cassandra 分布式数据库,高度可扩展,用于管理大量的结构化数据 高可用性,没有单点故障 列式数据库 ...
[Go]基于Gin的Web服务端构建
关于Gin的基本使用方法可移步Gin中文文档 本文以个人实际工程经验为基础,介绍了一种简易但实用的Web服务端构建方式,demo源码见文末。 包含状态的HTTPServer封装要起一个Web服务,首先需要有一个server监听接口并接收http请求。Go在net/http包中有内置的http.server,结构包含了监听端口号Addr、处理方法Handler以及超时设置等属性。有一点不足的是,其没有一个属性或方法能返回当前server的状态。因而需要进行简单封装: 1234567891011type HTTPServer struct { server *http.Serv...
[Go]并发调度模型
Go因Goroutine而与众不同。在Go程序中所有的用户代码都运行在Goroutine中,为了让程序高效运行需要一个合理的调度机制进行Goroutine的并发调度。 Go语言内置运行时,面向并发需求设计了全新的架构模型——GPM调度模型。 G:Goroutine的简称。 虽然Go进程内的一切都以G的方式运行,但G并非执行体,它仅保存并发任务状态,为任务执行提供栈内存空间; M:系统线程(OS Thread)的代称,M取自其寓意Machine的首字母。 M是代码的实际执行体。其通过修改寄存器,将执行栈指向G自带栈内存,并在此空间内分配栈堆帧,执行任务函数。 M必须绑定一个有...
[Go]简述垃圾回收(GC)
GC问题的核心是:抑制堆增长,充分利用CPU资源。Go所采用的GC算法是经典标记-清除算法的进一步改良。本文在介绍Go中GC逻辑之前会先介绍基本的GC算法。 基本GC算法基本的垃圾回收(GC)算法有四种:引用计数法(Reference Counting)、复制法(Copying)、标记-清除法(Mark-Sweep)和标记-压缩法(Mark-Compact)。注:在某些语言环境中会同时使用其中的多种算法进行垃圾回收。 基本流程 检查分配内存总量是否超过预设阈值; 如超过阈值,暂停一切用户逻辑,进行垃圾回收(不释放物理内存); 垃圾回收完成后,恢复用户逻辑,将阈值设为存活对象所用内存的两倍...
[Go]简述内存分配
内存分配的核心目标 每次申请大内存块,自主管理,减少系统调用 基于块的内存复用,加快内存分配和回收 内存分配的基本策略 每次从系统申请大块内存以减少系统调用; 将申请到的大块内存进行切分构成链表; 为对象分配内存时,只需从大小合适的链表中提取一小块; 回收对象内存时,会将提取的小块内存归还原链表; 如闲置内存过多则尝试归还部分内存给操作系统; 内存块Go的内存分配器将管理的内存块分为两种: span:由多个连续的页(Page)组成的大块内存; 123//malloc.go PageShift = 13, PageSize = 1<<PageShift, ...
[Go]Goroutine到底是什么:从进程到Go协程
本文以尽量精简的方式介绍了进程、线程、子例程、协程和Go协程的相关概念和关系。 进程(Process) 定义:进程是计算机中正在运行程序的实体(实例):在面向进程设计的系统中,进程是程序的基本执行实体;在面向线程设计的系统中,进程本身不是程序运行的基本单位,更多的是作为线程的容器。 概念:进程是一个实体,拥有独立的地址空间,包括文本区域,数据区域,堆栈等。 程序与进程:程序本身只是指令、数据及其组织形式的描述,进程才是真正运行的示例。一个程序可有若干进程,每个进程都可以以同步或异步的方式独立运行。 进程的并行:多个程序可以进程的形式加载到内存中,并通过时分复用,在同一个处理器上表...
[Godep]如何合理更新Go项目依赖
利用godep更新依赖库,最常见的做法是将godep.json中的依赖库版本进行更新,再godep save即可。但这很可能会使得母库和子库的共同依赖不同步进而可能产生报错,这才是本文想解决的问题:Go的包管理工具godep并不像诸如iOS包管理工具CocoaPods那样可以自动统一母库A和子库B的共同依赖(如库C)。当需要对子库B进行更新时,如果单纯的在库A中更新库B,则有可能发生同一个项目A中存在不同版本的依赖库C的情况。为了解决上述问题可进行如下操作:1、在B路径中更新子库B(此时C可能也会跟着更新) 1git pull 2、 在A路径中移除项目A中的Godeps和Vender文件...
wanmii
don't judge something easily