Lerko Blog

快乐Geek

golang map实现

golang map实现

一个简单的实例

golang通道的实现

golang通道的实现

简单的示例 package main func main() { ch := make(chan string, 1) ch <- "1234" println(<-ch) } _type 类型 type _type struct { size uintptr // 类型的大小,以字节为单位。 ptrdata uintptr //指针数据的大小...

Gorm携程泄漏问题

Gorm携程泄漏问题

一段有问题的代码 为什么会这样 如何防止 我们可以使用一些数据库查询关闭的校验工具 https://github.com/ryanrolds/sqlclosecheck 确认数据库行和统计信息已正确关闭的 Linter go vet -vettool=$(which sqlclosecheck) ./... 结论

Stackstorm快速开始

Stackstorm快速开始

Stackstorm 基本介绍 Stackstorm 是一个分布式自动化平台 可以定义工作流进行自动化操作,工作流由多个动作组成,各个动作之间可以有参数互相传递。 基本流程是 传感器感知 --> 执行触发器 --> 触发规则(规则检查条件) --匹配--> 运行工作流或者动作 | -- 不匹配 --> 结束 基...

Mysql索引和排序

Mysql索引和排序

索引对排序的影响 建立索引时,可以指定索引的排序方向。 这对排序查询是有影响的。特别是多列的情况。 在多张表连接查询的情况下,只有当order by 子句引用的全部为第一个表的时候才能使用索引作为排序辅助。 order by 查询和普通查询一样:需要满足最左前缀匹配原则才可以利用到索引 但是有一种指定前缀常量的方式可以使用到索引 比如我们有一个索引列 (date,id,cid) ...

文件系统与mysql

文件系统与mysql

磁盘 我们知道传统的硬盘是通过旋转盘片和抖动磁头来实现数据的读取。 操作系统会通过硬盘的驱动取发生读取指令,硬盘做出相应的回应。 操作系统有多种算法来进行硬盘的调度: 先来先服务 最短寻找时间优先 扫描(SCAN)算法(又称电梯算法) 循环扫描(Circulair SCAN, C-SCAN)算法 磁盘模型是这样的 图中指向的那个环就是一个磁盘块,磁盘...

mysql的profiles

mysql的profiles

profiles能做什么 显示sql执行过程中各个环节的消耗情况,例如cpu使用情况,打开表、检查权限、执行优化器、返回数据等分别用了多长时间,可以分析语句执行慢的瓶颈在哪。 如何使用 如果要使用这个命令首先要设置profiling为on,mysql默认设置为off; select @@profiling //查看profiling set profiling =1;//打开pro...

mysql的B+Tree

mysql的B+Tree

查找的学问 当我们翻开新华字典,我们都会知道如果要查一个字的话,我们一般都会取目录里面查看,找到对应的字。 但是机器怎么找东西? 于是出现了各种查找算法 顺序查找:傻瓜遍历 二分查找:递归的进行1/2的查找,直到逼近数值,需要数据有序 插值查找:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。需要数据有序 斐波那契查找:是二分查找的一种提升算法,通...

Mysql查询优化器的局限性和Hint

Mysql查询优化器的局限性和Hint

局限性 对关联子查询支持比较糟糕,特别是IN这种子查询。mysql 不会将数据查出来之后在进行二次查询,而是将子查询的逻辑压入外层查询。 比如 select * from outTable where cid in(select * from innerTable where cid=1) 会被改造成为 select * from outTable where exists (...

Innodb基本知识点

Innodb基本知识点


Innodb与MyISAM的区别总结

Innodb与MyISAM的区别总结

锁 MyISAM:表级锁 Innodb:行锁(记录锁),页锁,间隙锁 间隙锁:用来防止插入的,主要是用来解决幻读 事务 MyISAM:不支持事务 Innodb:支持事务,并保有ACID完整性(原子性,隔离性,持久性,一致性) 外键 MyISAM:不支持外键 Innodb:支持外键 索引 MyISAM 不支持FULLTEXT,按照插入顺序排序 二级索引是直接指向数据的 I...

线段树

线段树

引入 现在我们要求一个数组进行两个操作 任意L到R的和 任意更新某个数 首先我们想到可以用前缀和,新建一个数组,保存每个位置到第一位的和 但是算法效率变化了 还有优化空间吗 线段树 线段树可以做到时间复杂度查找更新都是 log n 下面是一个例子 如果我们要找到 2 - 5的和 直接获取[3-5]的和再找到2的值相加即可 构建线段树 ...

TCP可靠性传输

TCP可靠性传输

TCP的特点及其目的 就一个 可靠性,需要解决数据破坏,丢包,重复,分片顺序混乱的问题 如何实现可靠传输 算法 慢启动 拥塞避免 快速重传 快速恢复 窗口 滑动窗口:传输效率,快速重传 拥塞窗口:流量控制,快速恢复 序列号和确认应答 TCP通过ACK(确认应答),来实现可靠的传输。 就是对方收到之后需要进行一个回复,这个回复中包含数据的序列号...

raft分布式协议

raft分布式协议

raft协议是什么 Raft 是一个易于理解的一致性算法。它在容错性和性能方面与 Paxos 相当。不同之处在于,它被分解成相对独立的子问题,而且它干净利落地解决了实际系统所需的所有主要部分。我们希望 Raft 将向更广泛的受众提供协商一致意见,并希望这一更广泛的受众将能够开发各种比目前更高质量的基于协商一致意见的系统。 什么是共识(分布式共识) 一致性是容错分布式系统中的一个基本问题...

TCP之Keepalive

TCP之Keepalive

Keepalive起源 tcp其实也有短连接和长链接的两种场景 短链接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的ser...

iptables

iptables

filter表 作用: 过滤 查看表 ➜ ~ sudo iptables -t filter -L -n **Chain INPUT (policy ACCEPT[接收])** target[处理方式] prot[协议] opt[额外参数] source[原地址] destination[目的端口] KUBE-SERVICES a...

Go语言之静态二进制文件

Go语言之静态二进制文件

基本知识 我们都从相同的基础开始,编译一个简单的 go 程序: package main import "fmt" func main() { fmt.Printf("hello world") } $go build -o mybin *.go 将在你的文件夹中生成一个二进制的“ mybin” 交叉编译 如果我们希望这个程序直接拷贝就可以运行到我们的服务器上,我们应...

Go语言之Map

Go语言之Map

map的特性 参数传递的时候是使用的值传递,如需改变的话需要传入指针 键值对,遍历输出无须。需要自己定义一个索引进行遍历 内存模型 map采用的是哈希表,使用拉链法解决冲突 src/runtime/map.go 下面是一个官方的解读 此文件包含Go的map类型的实现。 map只是一个哈希表。数据整理放入存储桶数组中。每个存储桶最多包含个键/元素对。 哈...

Go语言之Channel

Go语言之Channel

channel本质 channel其实就是传统语言的阻塞消息队列 结构体 type hchan struct { qcount uint // 队列中的总数据 dataqsiz uint // 循环队列大小 buf unsafe.Pointer // 指向循环队列(dataqsiz)的元素数组 elemsize uint1...

常见的缓存问题

常见的缓存问题

常见的缓存问题 缓存穿透 缓存穿透是指的请求不存在的key导致穿透到数据库进行查询 解决方案: 缓存击穿 大量流量查询一个key 解决方案: 监控热点的key,提前设置未永不过期。 监控范围可以是接口范围的,如果某个接口流量非常大的话就吧这个接口的key都设置为永久 缓存雪崩 大量的key同时失效 解决方案: key的过期时间设置为平滑的,不要全部的ke...

Mysql和Mongodb对比

Mysql和Mongodb对比

存储和查询 数据库 存储类型 查询 mysql 行存储 sql mongodb 文档存储 json形式 索引 mongodb 索引类型 数据结构 ...

Go语言之Slice

Go语言之Slice

Slice本质是什么 Slice是golang中一个可变长度的数组,我们知道可变长度的数组都是通过固定长度的数组进行扩容实现的,比如Java中的ArrayList。 Slice的本质是一个结构体如下: //在栈中的slice type slice struct { array unsafe.Pointer len int cap int } //在堆中的slice ty...

Golang之内存逃逸

Golang之内存逃逸

Golang内存分配方式 主要是堆(heap)和栈(stack)分配两种。 内存形式 特性 栈 栈分配廉价 对于栈的操作只有入栈和出栈两种指令,属于静态资源分配。函数的内部中不对外开放的局部变量,只作用于函数中。 堆 堆分配昂贵 堆中分配的空间,在...

golang的垃圾回收

golang的垃圾回收算法:三色标记法

三色标记法 初始化是对象都是白的 颜色 对应身份 白 可以清除 灰 移动到不可清除前的缓冲区域 黑 不可进行垃圾回收的变量 所有对象都是白色区域 确认顶级内存区域,...

istio流量控制

istio流量控制

istio资源类型 类型 作用 Virtual Services 虚拟服务:本质是一个配置片段,用来描述envoy策略 Destination rules 目的规则:对vs的流量进行进一步的精细配置 Gateways ...

istio注入原理

istio注入原理

备注:ks 为 sudo kubectl的别名 架构图 新建一个pods进行注入操作 apiVersion: apps/v1 kind: Deployment metadata: name: jiuxi labels: app: jiuxi spec: replicas: 1 selector: matchLabels: app: jiu...

Go实现一致性hash

Go实现一致性hash

什么是一致性Hash 一致性Hash的作用 特定的Key能确定对应的分区位置 Key运算之后能确定到有限的分区中(所以一致性hash的定位算法必须要能对分区进行循环的定位,存储空间抽象为一个环) 如何做到环状Hash 确定分区位置 比如是服务器的话可以使用 hash(服务器A的IP地址) % 2^32 2、 计算Key Hash值,并和分区位置大小进...

ServiceMesh是什么

ServiceMesh是什么

微服务的演化 我们可以看到当服务数量大大增加的时候,我们将不易于管理和查看微服务系统是否正常 下面是几种微服务的模式 传统集中式代理 通过运维治理,这种方式通常在DNS域名服务器的配合下实现服务发现。 客户端嵌入式代理 这是很多互联网公司比较流行的一种做法,代理(包括服务发现和负载均衡逻辑)以客户库的形式嵌入在应用程序中。这种模式一般需要独立的服务注册...

Istio官方实例搭建

Istio官方实例搭建

Istio是什么 Istio官网对其的定义 Connect:可以控制流量,进行熔断限流以及渐进部署 Secure:对微服务之间的通讯进行加密身份验证 Control: 对不同的请求进行负载均衡和资源分配 Observe: 提供各种服务面,可以通过Kaili进行监控 Istio的组件 1.6之前的架构 1.6之后的架构 我们可以注意到原先的解耦组件集...

golang 中 goroutine 的调度

本文转载自go夜读

郑宝杨(boya) 2018-08-01 listomebao@gmail.com 阅读源码前可以阅读的资料 Goroutine背后的系统知识 golang源码剖析-雨痕老师 go-intervals 也谈goroutine调度器 golang的调度模型概览 调度的机制用一句话描述: runtime准备好G,P,M,然后M绑定P,M从各种队列中获取G,切换到G的执行栈...