webcron
源码地址
功能列表
基本任务创建、启动、手动执行、暂停
任务日志
任务执行结果邮件通知
任务分组
任务运行实例控制
缺点
任务只能在单机跑
不能添加用户
评价
安装部署简单,功能页面简洁,适合任务量不多个人或者小型项目组使用。
gocron
源码地址
功能列表
基本任务创建、手动执行、禁止执行、删除
任务依赖
任务分组
超时、重试
可以选择任务执行结果通知不同用户,通知类型包括邮件(并支持模板配置)、slack、webhook。
任务日志
支持分布式,添加执行任务节点,创建任务可指定任务可运行的节点(如果是单例模式,会选择一台执行)
用户管理
登录日志
执行方式支持
Hello world
Go 标注库 net/http 中封装了丰富的 http 服务相关的方法,只需要使用标准库就可以方便的构建 http 服务。
Hello world 示例
package main
import (
"net/http"
"fmt"
)
type Handler struct {
}
func (h *Handler)ServeHTTP(rep http.ResponseWriter, req *http.Request) {
rep.Write([]byte("Hello world"))
}
func main() {
ht
InnoDB MyISAM都是使用B-tree索引,只是两者实现方式不太一样,InnoDB 使用了聚簇索引的数据结构也称为B+tree,而MyISAM并没有。
explain 返回的 Extra 中包含 Using index 即表示使用索引覆盖查询(InnoDb、MyISAM都存在)。
explain 放回的 Extra 中包含 Using where是即表明在存储引擎把数据返回给 MySQL 服务器后再应用 Where 里的条件过滤行。这样就会导致存储引擎返回的数据比实际需要的多,就会导致额外的行被锁。
InnoDB索引中,覆盖查询要考虑主键的情况,即使索引中不包含主键,而查询包含索引中
前言
从我记事起就比较容易做梦,有多容易呢,我在桌子上趴10秒有时候就能做个梦,以前也有想研究或者记录下自己梦,每次都没坚持下来。这次在博客上开这个栏目用于后面记录醒来后记得比较清楚的梦并根据情况做些简单的分析,后面也会继续去关注梦方面的书籍深入研究这方面的东西。
梦的时间地点
梦的日期:2018/08/21,大约时间13:40-13:59
地点:公司工位
梦的内容
地点:一间很熟悉、同学很多的教室。
时间:梦开始时正在上课、梦里的教室人比较多、课本也比较多,推测应该是初中或高中的时候。
人物:梦里的人物没有比较清晰的特征,感觉好像是中学时期好多同学的形象交杂着,有个男同学感觉跟我比较亲近,表
这里记录以后准备读或者重读一些书的计划,计划起于 2018/11/01,多读书提升技术和各方面认知。
正在读
技术类
<< 算法导论 >> 5%
<< 现代操作系统 >> 10%
<< 亿级流量网站架构核心技术 >> 50%
<< 这就是搜索引擎 >> 25% 介绍搜索引擎的架构和各部分实现方案。
<< 编码的奥秘 >> 25% 计算机编码普及读物
<< 数学史 >> 4% 数学历史发展和起源
<
在程序开发过程中我们经常需要去做性能测试、或性能排查方面的工作,而 Go 语言自带的 pprof 是个非常强大的工具,不仅使用简单而且可以用于线上服务性能的排查。
pprof 采样数据主要有三种获取方式:
runtime/pprof:手动调用 pprof API 来生成和写入采样文件,灵活性高。
net/http/pporf 通过 http 服务获取采样文件,简单易用,适用服务性能排查
go test 通过 go test -bench . -cpuprofile prof.cpu 获得采样文件,适用于对函数单独性能测试
我们这里演示下 net/http/pprof 的使用
基于web应用
IP 地址(Internet Protocol Address)是给每一个连接到互联网上的设备分配的一个全球唯一的标识符,也成为网际协议地址,IP 地址包括两类 IPv4 和 IPv6。
IPv4
在 TCP/IP 协议中,IP 地址是以二进制的形式表示的,共 32bit,为了方便记忆,我们一边使用十进制来记录比如:10.11.123.23。
IPv4 分类
A 类地址
A 类地址由 1 字节的网络地址和 3 字节的主机地址组成,且网络地址最高位为 “0”。
A 类地址网络数为 2^7=128,扣除两个保留地址:全是 0 的做为网络号,全是 1 的做为广播号。所以 A 类地址网络地址范围为 1
竞态检查器
go run -race main.go
编译反编译
// 编译
go build -gcflags="-S"
go tool compile -S hello.go
go tool compile -N -S hello.go // 禁止优化
// 反编译
go tool objdump <binary>
我们用 Go 写两个遍历两层 slice 的算法。
var items = make([][]int32, 1000)
func init() {
for i := 0; i < 1000; i++ {
items[i] = make([]int32, 1000)
for j := 0; j < 1000; j++ {
items[i][j] = rand.Int31n(2)
}
}
}
// 横向遍历
func sumRows() int {
var sum = 0
for
什么是基准测试
基准测试是测量一个程序在固定工作负载下的性能。我们通常会用来对比对同一个问题不同解决方案的性能,从而帮助我们做决定选择哪个方案更合理。
Go 的基准测试
Go 基准测试规则如下:
必须放在以 _test.go 结尾的文件中。
函数名必须以 Benchmark 开头
函数必须接受一个参数 *testing.B
没有返回值
基准测试受机器状态等因素的影响每次跑的结果很难保持完全一致,但是基本会在一个很小的范围内波动。
写一个简单的基准测试如下
import "testing"
func sum() int {
sum := 0
for i := 1; i &l