database/sql包连接池解读
连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读database/sql包的连接池实现来给自己一些参考和启发。首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.htm...阅读全文
连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读database/sql包的连接池实现来给自己一些参考和启发。首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.htm...阅读全文
16位的端口号数量有限,如果每次后端交互都需要新建连接,理论上来说,同时请求后端Service的Goroutine数量无法超过65535这个硬性限制,在如今这个动辄“十万”“百万”高并发时代,最高6w并发貌似不太拿得出...阅读全文
最近碰到群里网友问如果检查网络连接的Timeout,联想最近看到的另一个问题, 在这篇文章统一记录一下。 如果检查一个网络错误是Timeout导致的? 自 Go 1.6开始, 所有的超时导致的网络错误都可以通过net.Error的Timeout()方法检查。 123if err, ok := err.(net.Error); ok && err.Timeout() { ……} 更早版本的Go并没有专门的检查Timeout方法。 可以参考: https://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error 产品中一定不要使用默认的http.Get 如果你觉得方便,直接使用http.Get或者类似的...阅读全文
对于一个常驻、高访问量的网络服务来说,升级/重启时,一个难以忽视的问题是避免对正在通信的客户端造成影响。因此大家一直在寻求一种优雅、零宕机的升级/重启方案(seamless reload/upgrade)。在工程师们的日常实践中,尝试了不同的方案。各方案的核心都是fork-exec流程,其不同的区别就是在这个过程中,如何优雅的传递活跃的网络连接,如何避免新建连接失败,以及处理这个过程中的错误和如何回退。 方案选型 首先先简单介绍一些方案1: SO_REUSEPORT 多进程 在HAProxy 1.5.11时,采用该方案。首先可以对监听 socket 启用SO_REUSEPORT,这样可以使得多个监听 socket 共享同一个地址,这样可以使得我们能同时启动多个进程来监听同一个地址。在升级或重...阅读全文
1.下载并导入数据库驱动包官方不提供实现,先下载第三方的实现,点击这里查看各种各样的实现版本。这里选择了Go-MySQL-Driver这个实现。地址是:https://github.com/go-sql-driver/mysql/。然后按照里面的说明下载驱动包:$ go get github.com/go-sql-driver/mysql最后导入包即可:import "database/sql" import _ "github.com/go-sql-driver/mysql" 2.连接至数据库db, err := sql.Open("mysql", "root:root@/uestcbook")3.执行查询(1)Exec result, err := db.Exec( "INSERT IN...阅读全文
在Go语言中使用redis数据库 连接到Redis 存储和获取数据 解码成json 最后应该在web应用中使用一个连接池 在Go语言中使用redis数据库 日期:2016-09-13 作者:未知 原文:https://dinosaurscode.xyz/go/2016/09/13/using-go-with-redis/?utm_source=studygolang&utm_medium=email&nsukey=d7foHOu2JWuVtNx567nmYebGiV3xA77Y66gJwySUW6tBi9LTombwJLWAzrYVdYP1IZH1MZzOhcz%2BGh8xt%2FggTToFElonX%2FrUuMc%2B%2FT0eQnzrZLJM7%2BkF8QNBQ3zfhlNkQ...阅读全文
版本 golang -- 1.12.4 mongodb -- 4.0 go driver -- 1.0.0 简介 在上一篇《用golang实现mongodb数据库连接池-基本篇》我们实现了mongodb的golang driver按序使用的基本版,但还需要进一步提升效率和高并发安全。本篇张实现高效率协程安全版。 data race 什么是data race,考虑如下代码: var balance int func Deposit(amount int){ balance = balance + amount} func Balance() int { return balance} //Alice: go func(){ bank.Deposit(200) // A1 fmt.Println...阅读全文
protobuf详解 1、安装 源码包下载 git clone https://github.com/google/protobuf 安装依赖 sudo apt-get install autoconf automake libtool curl make g++ unzip 生成需要的配置脚本 cd protobuf //进入源码库中 ./autogen.sh //运行脚本生成需要的配置脚本 编译安装 ./configure make make check sudo make install sudo ldconfig //用于刷新共享库的缓存 安装proto-gen-go go get -u github.com/golang/protobuf/proto go get -u githu...阅读全文
golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好。下面演示下具体的使用,完整代码示例可以参考最后。 下载驱动 sudo go get github.com/go-sql-driver/mysql 如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决 sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sq...阅读全文
package sql 中最核心的的数据结构是sql.DB, 其为上层应用程序提供一个统一的抽象体,它不代表一个数据库连接,也不代表一个连接池,其是sql的包的作者为了实现:并发访问安全控制,连接池等诸多功能而设计的一个综合抽象数据结构。具体见代码注释 221 type DB struct { #通过driverName获取driver,通过driver的Open()方法获得到DB的原始连接,sql.Open() 创建一个DB实例 222 driver driver.Driver #DB连接字符串,创建DB实例不会理解创建连接,只有使用的时候才去创建连接 223 dsn string 224 // numClosed is an atomic counter which represents...阅读全文
是什么? snowflake ID 算法是 twitter 使用的唯一 ID 生成算法,为了满足 Twitter 每秒上万条消息的请求,使每条消息有唯一、有一定顺序的 ID ,且支持分布式生成。 主要解决了高并发时 ID 生成不重复的问题 结构 snowflake ID 的结构是一个 64 bit 的 int 型数据。 如图所示 : 1 bit:不使用,可以是 1 或 0 41 bit:记录时间戳 (当前时间戳减去用户设置的初始时间,毫秒表示),可记录最多 69 年的时间戳数据 10 bit:用来记录分布式节点 ID,一般每台机器一个唯一 ID,也可以多进程每个进程一个唯一 ID,最大可部署 1024 个节点 12 bit:序列号,用来记录不同 ID 同一毫秒时的序列号,最多可生成 4096...阅读全文
Go语言使用Golang连接MongoDB数据库实现增删改查 1.通过mongodb服务端口号启动mongodb服务 text 2.连接mongodb数据库 3.插入数据到持久层mongodb中 4.在持久层mongodb中删除数据 5.将数据在持久层mongodb中更改 6.在数据库中查询单条或多条数据 7.显示数据库集合中元素数目 本文转载自:http://www.hemadaili.com/help/news/detail/5d54ff289f02b700084d92a5.htm...阅读全文
golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好。下面演示下具体的使用,完整代码示例可以参考最后。 下载驱动 sudo go get github.com/go-sql-driver/mysql 如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决 sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sq...阅读全文
# Memcached Client for Golang golang版本的memcached客户端,使用二进制协议,支持分布式,支持连接池,支持多种数据格式 ### [](https://github.com/pangudashu/memcache#特性)特性 * 支持多server集群 * 与memcached使用二进制协议通信 * 支持连接池 * 存储value支持golang基本数据类型:string、[]byte、int、int8、int16、int32、int64、bool、uint8、uint16、uint32、uint64、float32、float64、map、结构体,不需要单独转为string存储 * Replace、Increm...阅读全文
mgo 设置 最大连接 https://github.com/go-mgo/mgo/issues/246 https://www.bbsmax.com/A/rV574pAXdP/ 看了不是很懂如何限制,有经验的童鞋能给详细解释下,如何做mongodb连接池的最大限制吗...阅读全文
比如就一个服务A,部署在服务器1上。 redis部署在服务器2上。 为什么还会需要redis连接池这个东西?我在服务A上维护一个全局变量的redis连接实例,前端请求过来我都是用这个连接实例去执行redis指令,不也可以吗? redis连接池,无非就是高并发的时候可以支持多个redis连接实例去连接redis,但是redis本身就是单线程的,我多个连接同时去连redis(不还是得排队么),然后执行指令,和我单个全局连接直接去一个个执行redis指令,感觉应该差不多性能吧? 而且如果是全局单个redis连接的话,每次请求过来我还省了连接这个操作,不是又省了点时间么...阅读全文
文:https://blog.csdn.net/narlon/article/details/81835003 db(一般是mysql,或是类似的,比如mariadb)在游戏服务器中,启动了数据落地的作用。游戏服务器可以直接和db建立访问连接操作数据,或者通过一个中间人(DbServer)来完成这个工作。本文,我们以独立DbServer来分析带来的好处,以及遇到的问题。 下文提到的一些优势,如果不单独封装一个db服务器(通过一个存储模块的方式来实现)也可能可以做到。但如果有一个独立的db服务器时,更容易把这一点实现的比较纯粹。 适配存储过程,隐藏存储细节 db服务器可以做到,缓存数据存储到redis,超时数据mysql落地,而外层数据完全无感。同样的,当底层进行存储切换,或是升级时,只需要改...阅读全文
最近在做一个golang的连接池。测试过程中发现一个有趣的现象,获取的连接没有归还给连接池,那么过一段时间后该连接会自动关闭掉。猜测这跟连接池应该是没有关系的,于是再用普通的连接做了实验,即dial一个tcp连接,发送请求,然后程序进入sleep,一段时间后该连接还是会自动关闭。 对这个过程进行抓包分析,发现主动关闭连接的是client端,即client端主动向服务端发送了FIN包。 考虑到golang有垃圾回收机制,如果该连接被程序引用着怎么办?是否也会自动关闭?想想这应该是不可能的,那这是不是跟垃圾回收有关系?! 对程序稍作改动,在发送完第一个请求之后,保留该连接的reference不释放,进入sleep。观察一段时间,无论过多久,netstat查看该连接都是ESTABLISHED状态的...阅读全文
一、redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在...阅读全文
传输数据上增加包头 ``` conv:连接号。UDP是无连接的,conv用于表示来自于哪个客户端。对连接的一种替代 cmd:命令字。如,IKCP_CMD_ACK确认命令,IKCP_CMD_WASK接收窗口大小询问命令,IKCP_CMD_WINS接收窗口大小告知命令, frg:分片,用户数据可能会被分成多个KCP包,发送出去 wnd:接收窗口大小,发送方的发送窗口不能超过接收方给出的数值 ts:时间序列 sn:序列号 una:下一个可接收的序列号。其实就是确认号,收到sn=10的包,una为11 len:数据长度 data:用户数据 ``` 1.超时重传加速: TCP超时计算一次就是RTOx2,何况3次,而KCP启动快速模式后可设置超时时间(大家都说1.5比较好),提高了传输速度。 2.选择重...阅读全文
用 1.3 版本使用 Go 开始,连接 MongoDB 使用的驱动中,最常见的就是:mgo.v2 这个库一度是唯一的选择,它的接口设计合理,与 Golang/MongoDB/bson 适配的也做的不错。然而这个库长期处于无人看管的状态,有一大堆让人难以忍受 bug,其中我们遇到的就有不少: 当短时间执行大量 db 操作把并发执行的与 MongoDB 的连接池增大之后,多余的连接没有被正确的回收掉(即便设置了 maxIdleTimeout 和 minPoolSize)。 执行 bulk 操作的 size 是固定不可配置的。 在我们的线上项目中,偶尔的业务峰值会照成某几个服务短时间大量的 db 操作,而一旦这些 db 操作带来的连接数量被撑大之后,耗尽 db 的连接数资源之后。其他的服务就无法连...阅读全文
要改公网的的IP首先是你有PPTP的帐号密码服务器地址,有了后点击图一建立新的网络连接,点击连接到工作区。点击连接到我的,输入服务器的地址点击下一步。输入帐号密码后点击下一步,接着点击立即连接即可。如果你拥有的是国外的帐号,那么连接后就是国外的IP地址了。等于是更换了公网的IP地址...阅读全文
```go var ( db = sql.Open() ch = make(chan int, 3) ) func main() { go func() { ticker = time.NewTicker(time.Second) for t := range ticker.C { work() } } } func work() { go query1() go query2() go query3() for j := 0; j < 3; j++ { <-ch } } func query1() { rows, err := db.Query...阅读全文
简介 Gorm是Go语言开发用的比较多的一个ORM。它的功能比较全: 增删改查 关联(包含一个,包含多个,属于,多对多,多种包含) CallBacks(创建、保存、更新、删除、查询找)之前 之后都可以有callback函数 预加载 事务 复合主键 日志 database/sql 包 但是这篇文章中并不会直接看Gorm的源码,我们会先从database/sql分析。原因是Gorm也是基于这个包来封装的一些功能。所以只有先了解了database/sql包才能更加好的理解Gorm源码。database/sql 其实也是一个对于mysql驱动的上层封装。"github.com/go-sql-driver/mysql"就是一个对于mysql的驱动,database/sql 就是在这个基础上做的基本封装...阅读全文
监控io性能、free、ps、查看网络状态和linux抓包工具 一、监控io性能 1、iostat -x 磁盘使用 1 关注最后一列的数值,数值大说明磁盘有异常 2、iotop 磁盘使用 安装:yum install -y iotop 2 二、free命令 查看内存使用多少,剩余多少请看第二行的数据。另外我们还可以加-m或-h 或者-g选项分别以M或G为单位打印内存使用状况: 常用: free -h 3 三、ps命令 ps查看系统进程 用法:ps aux 或 ps -elf 4 PID :进程的id,想终止某一个进程,则用 ‘kill 进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill -9 进程pid STAT :表示进程的状态 D:不能中断的进程(通常为IO) R: 正在运行...阅读全文
Kinesis 的整体架构如下: image.png Kinesis 的基本术语 Kinesis Data Stream Kinesis Data Stream 实时吸收大量数据、持久存储数据并使这些数据可供使用。其由多个分片组成,每个分片里面包含一系列数据记录,每个数据记录有一个由 Kinesis Data Stream 分配的序列号。 数据记录 数据记录是存储在 Kinesis data stream 中的数据单位。数据记录由序列号、分区键和数据 Blob 组成,数据 Blob 可以是 最多 1 MB,并且是不可变的。 保留周期 数据记录在添加到流中后保存的时长,默认保存 24 小时,可以设置为更久的值,最长保存 168 小时,但是设置超过 24 小时的保留周期是会额外收费哦。 分片 分...阅读全文
2839526_203626093214_2.jpg 库: database/sql : database/sql 是 golang 的标准库之一,它提供了一系列接口方法,用于访问关系数据库。它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现。 database/sql库提供了一些 type。这些类型对掌握它的用法非常重要。 DB : 数据库对象。 sql.DB 类型代表了数据库。和其他语言不一样,它并是数据库连接。golang 中的连接来自内部实现的连接池,连接的建立是惰性的,当你需要连接的时候,连接池会自动帮你创建。通常你不需要操作连接池。一切都有go来帮你完成。 它提供了一些跟数据库交互的函数,同时管理维护一个数据库连接池,帮你处理了单调而重复的管理工作,并且在多个gor...阅读全文
gorose orm新版本(0.8.0)发布,新增连接池等特色功能 经过几个日夜, gorose群众多个成员的共同艰苦奋战, 全新版本 0.8.0 发布, 在遵循简单易用的基础之上, 做出了许多改进. gorose orm既然号称 gol orm中最风骚的orm, 这次的改进, 也是风骚范儿十足, 下面我们一起来看看改进后的特色吧: 一. 按照开源项目标准重构目录,让更多的人可以自由协作共同开发 /docs/ ---- 文档目录, 这里包含多个语言的不同使用文档 /drivers/ ---- 不同数据库的驱动目录, 可以自由增加任何其他数据库的目录 /examples/ ---- 使用示例目录, 可以在这里找到大部分的用例 /test/ ---- go testing 自动测试, 包括简单的...阅读全文
最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。 首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕后归还给连接池,所以假设用golang的sql模块,一个程序一个DB就行了。 既然有连接池的支持,那么也要注意千万不要泄露连接池的连接。假设你采用Query来执行查询语句,那么会返回一个sql.Rows结构,这个结构会占用一个连接,只有在遍历完才会自动关闭,所以最好是获得了Rows后执行一次Rows的Clos...阅读全文
项目地址 Github: github.com/wuzhc/gmq 喜欢的可以star一下 ^_^ 1. 概述 gmq是基于redis提供的特性,使用go语言开发的一个简单易用的队列;关于redis使用特性可以参考之前本人写过一篇很简陋的文章Redis 实现队列; gmq的灵感和设计是基于有赞延迟队列设计,文章内容清晰而且很好理解,但是没有提供源码,在文章的最后也提到了一些未来架构方向; gmq不是简单按照有赞延迟队列的设计实现功能,在它的基础上,做了一些修改和优化,主要如下: 功能上 多种任务模式,不单单只是延迟队列;例如:延迟队列,普通队列,优先级队列 架构上: 添加job由dispatcher调度分配各个bucket,而不是由timer 每个bucket维护一个timer,而不是所有b...阅读全文
前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的。 我将从一个最简单的聊天室的功能来实现,看看这样一个说起来好像很简单但的功能,我们需要考虑哪些问题。 我使用golang实现,从0开始实现,需要借助的是websocket来实现即时,基础知识自己补一下,这里不做过多赘述。 各个版本和测试客户端所有的代码都已经上传github,如果有需要请查看,https://github.com/LinkinStars/simple-chatroom 功能描述 即时聊天室包含功能(这里写出的功能假设就是产品经理告诉我们的): 1、所用用户能连接聊天室 2、连接成功的用户能向聊天室发送消息 ...阅读全文
0x1 背景 golang的协程是好用,但是有时候瓶颈并不在语言上,而是在后面的数据源上面,例如我们常见的mysql,redis等,当一个后端服务很多请求的时候,语言是能hold得住,但是 mysql产生错误,比如 too many connection, too many time_wait 等等这些,今天我们就分析一下怎么解决这种问题 0x2 代码范例 请查看main.go, halokid (有帮忙的话请start或者follow一下哦,谢谢) 0x3 分析 只执行ini函数, 检查mysql的进程显示为(原有的mysql是没有进程在处理的) 没执行前 mysql> show processlist; +----+-----------------+------------------...阅读全文
Fabric CA提供以下功能: 1、身份注册,或者将连接到LDAP作为用户注册; 2、颁发登录证书(ECerts); 3、颁发交易证书(TCerts),保证链上交易的匿名性与不可连接性; 4、证书续期与撤销看一个 fabric-ca服务器在Hyperledger Fabric中架构图如下: 有两种与Hyperledger Fabric CA服务器交互的方式:通过Hyperledger Fabric CA客户端或通过一个Fabric SDK。 与Hyperledger Fabric CA服务器的所有通信都是通过REST API进行的;fabric ca中国密改造需要修改的程序目录如下:一、cmd目录 1、cmd目录主要提供了fabric-ca-client,fabric-ca-server...阅读全文
package main type hub struct { // 注册了的连接器 connections map[*connection]bool // 从连接器中发入的信息 broadcast chan []byte // 从连接器中注册请求 register chan *connection // 从连接器中注销请求 unregister chan *connection } var h = hub{ broadcast: make(chan []byte), register: make(chan *connection), unregister: make(chan *connection), connections: make(map[*connection]bool), } f...阅读全文
遇到的问题连接池。由于PHP没有连接池,当高并发时就会有大量的数据库连接直接冲击到MySQL上,最终导致数据库挂掉。虽然Swoole有连接池,但是Swoole只是PHP的一个扩展,之前使用Swoole过程中就踩过很多的坑。经过我们的讨论还是觉得使用Golang更加可控一些。框架的选择在PHP中一直用的是Yaf,所以在Go中自然而言就选择了Gin。因为我们一直以来的原则是:尽量接近底层代码。封装过于完善的框架不利于对整个系统的掌控及理解。我不需要你告诉我这个目录是干嘛的,这个配置怎么写,这个函数怎么用等等。>>>阅读全...阅读全文
一、打开mysql数据库 1 下载并导入数据库驱动包 我们选择了Go-MySQL-Driver这个实现。地址是:https://github.com/go-sql-driver/mysql/。 下载驱动包: $ go get github.com/go-sql-driver/mysql 2 导入包: 通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了. import "database/sql" import ...阅读全文
如标题,怎么办呢?请各位大佬赐...阅读全文
驱动接口设计特点 驱动层设计很简单,没有并发锁的控制 驱动层的设计是基于单个连接的,没有考虑连接池 驱动层事务Tx和Stmt是独立分离的,Tx只有两个简单的方法就是Commit() 和Rollback() 驱动的具体实现者只需要在单个连接上实现驱动层的API接口即可 driver包的数据结构 调用关系 驱动注册 具体的数据库驱动只需要按照接口层的定义,实现api,然后在sql包的全局驱动切片sql.drivers中注册即可。 27 var ( 28 driversMu sync.RWMutex 29 drivers = make(map[string]driver.Driver) 30 ) 38 func Register(name string, driver driver.Driver)...阅读全文
数据库操作是一个应用必不可少的部分,但是我们很多时候对golang的sql包仅仅是会用,这是不够的。每一条语句的执行,它的背后到底发生了什么。各式各样对sql包的封装,是不是有必要的,有没有做无用功? 这是go to database package系列文章的第一篇。本系列将按照程序中使用sql包的顺序来展开 先来看一段简短的代码: package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) func main() { db, err := sql.Open("mysql", "user:password@/dbname") if nil != err { panic(err) } age :...阅读全文
前篇: 一个TCP长连接设备管理后台工程(一)一个TCP长连接设备管理后台工程(二) Github仓库地址 TCP协议整合JTT808协议 前面简单说明了基于golang的net库进行TCP通讯。现在我们需要将现有的协议整合进去。行业内车辆终端一般都是对接交通部的JTT808协议,此处我们要实现的是JTT808-2019版本。 消息结构 标识位 消息头 消息体 校验码 标识位 0x7e 0x7e 标识位应采用0x7e表示,若校验码、消息头以及消息体中出现0x7e及0x7d,则要进行转义处理。转义规则定义如下: 先对0x7d进行转义,转换为固定两个字节数据:0x7d 0x01; 再对0x7e进行转义,转换为固定两个字节数据:0x7d 0x02。 转义处理过程如下: 发送消息时:先对消息进行封装...阅读全文
题目:设计一个身份证查询系统,将身份证号md5 之后存储,输入md5值查询对应的身份证号。 要求:成本低,查询速度快 设计思路: 将所有可能的身份证号做一个简单的统计计算数据量 根据数据量选择存储方式 查询 身份证生成规则: 身份号码是特征组合码,由前十七位数字本体码和最后一位数字校验码组成。排列顺序从左至右依次为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 地址码: 表示编码对象常住户口所在县(市、旗、区)的行政区划代码。对于新生儿,该地址码为户口登记地行政区划代码。需要没说明的是,随着行政区划的调整,同一个地方进行户口登记的可能存在地址码不一致的情况。行政区划代码按GB/T2260的规定执行。 出生日期码:表示编码对象出生的年、月、日,年、月、日代码之间不用分隔符...阅读全文
``` orm.RegisterDataBase("default", "mysql", "root:pass@tcp(db:3306)/db1") ``` 可以对上面连接串密码部分加密吗...阅读全文
Go 其他特性 为了保持 Go 语法介绍的完整性,有一些 Go 独有的特性,并没有在前面的章节介绍。说 Go 独有的特性其实并不恰当,因为其他语言并非在语言层面定义上下面的几个特性。 本节想介绍的关键字与函数包括 defer, append, close, make, new, copy, delete,只有第一个是关键字,后6个都是内置函数。 defer defer 是 Golang 中的广义的通用析构函数。析构函数是在Java,C++类中所定义的一类在类被销毁时执行收尾的函数。什么叫收尾,就是类似于离家出门前总是要锁门;下班了总是要打卡这样一类,默认都需要在结束时做的事情。在函数结束时,哪些工作需要收尾呢? 打开的文件要关闭,不管发生读写任何操作; 打开的网络连接要关闭,不管你访问了哪些...阅读全文
介绍 超时 请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求; 服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时; 响应超时,服务端给客户端返回响应时超时,此时服务端已经处理了请求。 超时发生需要客户端和服务端如何处理呢? 客户端最常见方法: 重试(前提是服务端接口支持幂等),重试间隔梯度增大,重试次数阈值最大值 不重试直接去查询请求结果状态,根据结果确认是否请求成功,或者什么都不处理,直接认为失败不做进一步处理 具体接口场景具体对待 服务端: 服务端内部如果超时了,应该尽快给客户端返回,告诉客户端超时失败,这个主要是通过服务端内部超时控制来实现,例如:golang http.TimeoutHandler 幂等性 支持接口无限重试主要靠的就是幂等性,实...阅读全文
文链接:https://blog.csdn.net/qq_31930499/article/details/98353008 1.使用在数组中 在数组字面量中,如果省略号"..."出现在数组长度的位置,那么数组的长度由初始化数组的元素个数决定。 q := [...]int{1,2,3} fmt.Printf("%T\n",q) //"[3]int" 2.打散Slice package main import ( "fmt" ) func main() { var arr1 []int arr2 := []int{1,2,3} arr1 = append(arr1,0) arr1 = append(arr1,arr2...) //arr2... 将切片arr2打散成 ==> arr1 = ap...阅读全文
http://www.01happy.com/golang-mysql-demo/ 下载驱动 sudo go get github.com/go-sql-driver/mysql 如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决 sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sql-driver/mysql GOPATH的值根据自行环境进行替换。 创建测试表 在mysql test库中创建测试表 CREATE TABLE IF NOT EXISTS `test`.`user` (...阅读全文
上一章中我们一起探讨了golangdatabase/sql包中如何获取一个真实的数据库连接。当我们拿到一个数据库连接之后就可以开始真正的数据库操作了。本章讲继续深入,一起探讨底层是如何进行数据库操作的。 上一章中我们说到: db.Query() 实际上分为两步: 获取数据库连接 在此连接上利用driver进行实际的DB操作 func (db *DB) query(query string, args []interface{}, strategy connReuseStrategy) (*Rows, error) { ci, err := db.conn(strategy) if err != nil { return nil, err } return db.queryConn(ci, c...阅读全文
1、golang的mogodb包下载:http://gopkg.in/mgo.v2 http://gopkg.in/mgo.v2/bson 2、golang的mongodb操作(mgo):https://studygolang.com/articles/1737 3、mgo 的 session 与连接池:http://www.cnblogs.com/logo-fox/p/7016017.html 4、Mongodb学习笔记:http://www.cnblogs.com/eggTwo/p/4040252.htm...阅读全文
最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。 首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕后归还给连接池,所以假设用golang的sql模块,一个程序一个DB就行了。 既然有连接池的支持,那么也要注意千万不要泄露连接池的连接。假设你采用Query来执行查询语句,那么会返回一个sql.Rows结构,这个结构会占用一个连接,只有在遍历完才会自动关闭,所以最好是获得了Rows后执行一次Rows的Clos...阅读全文
基础部分 1.我们用 Go 替换 Python 的原因 2.为什么我最喜欢的编程语言是 Go 3.Golang json解析与生成 4.go mod 使用 5.在Go中构建并发TCP服务器 进阶部分 1.记一次go panic问题的解决过程 2.记一次golang中sync.Map并发创建、读取的问题 3.golang复用http.request.body 4.golang sql连接池的实现方法详解 5.图解Golang的内存分...阅读全文