-
Go单测
Go单测框架Go MockGo Mock 的核心原理就是通过将原始代码中的接口调用替换为 mock 对象,并在测试中对 mock 对象进行合适的设定和断言,从而实现对代码的全面测试。go get github.com/golang/mock/gomockgo get github.com/golang/mock/mockgen //--可以在写好interface之后把桩代码生成使用时生成桩代码的命令//go:generate mockgen -destination=./mock_h...…
-
Ants库学习
Antsants 是一个高性能且低损耗的 goroutine 池。https://github.com/panjf2000/ants主要思想:以空间换时间。写 go 并发程序的时候如果程序会启动大量的 goroutine ,势必会消耗大量的系统资源(内存,CPU),通过使用 ants,可以实例化一个 goroutine 池,复用 goroutine ,节省资源,提升性能。Ants依赖于Go底层的一些实现,比如Locker、sync.Pool、sync.condLockerLocker是一个...…
-
Git的其它命令
Git的其它用法总结在日常的开发中只用到了git一些基本命令,甚至有些是通过GUI界面来处理,这对于git这么出名的项目来说,属于是不太尊重了,因此今天学习总结一下git的其它命令stashgit stash save "xxx" #临时保存修改的文件 原理:压栈loggit log --online --graph #日志单行流程图pushgit push :branch_name #删除远端分支rmgit rm --cached filename #取消追踪某个文件 应用场景:不小心...…
-
Grep和awk的基本命令
grep & awk 常见的命令grep通常grep解决行内匹配问题,跨行建议awk 从一个文件中查找指定字符 grep "something" test_file 从多个文件中查找指定字符 grep "something" demo_* 查询时忽略大小写 grep -i 运行 ipconfig | grep -i ipv4结果如下 IPv4 Address. . . . . . . . . . . ...…
-
GraphQL & RESTful
GraphQL一句话解释:GraphQL 不是 REST 的替代品,而是另一种交互形式:前端决定后端的返回结果GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进。 请求所要的数据 不多不少 向API 发出一个 GraphQL 请求就能准确获得前端想要的数据,不多不少。 GraphQL 查询总是返回可预测的结果。使用 GraphQL 的应用可以工作得又快又稳,因...…
-
Wasm
WebAssemblyWebAssembly(缩写为 wasm)是一种使用非 JavaScript 代码,并使其在浏览器中运行的方法什么是WebAssembly (WASM)把应用的抽象层拿出来,把它编译成WASM,然后部署即可。这里面的核心技术就是WASM。WASM是一个编译目标(二进制指令集格式),一般是将别的编程语言例如Go,Rust,C++,Java,C sharp写出的应用编译成WASM。如果程序使用的是更加动态类型的语言,例如Python,JS,这样其实是把它们的解释器编译成了...…
-
Ext3文件系统
Ext3 文件系统背景时间:2002年左右问世增强:相较于ext2的基础上增加了日志,可以实现崩溃恢复题外话:ext4在ext3的基础上增加了一些优化,比如checksum特点 使用WAL实现崩溃恢复 在内存中 Block cache 每一个事务的记录 在磁盘上 文件系统 环形日志 Ext3 LogTx4 Start —— Tx4 Cmt 之间为一个完整的事务4在Ext3上...…
-
Index
Index索引是表中数据的一些属性的备份,它们用来加速查找DBMS 的取舍:每个数据库上创建的索引数量 索引存储带来的开销 维护索引带来的开销B+Tree诸多数据库采用的索引结构—B+Tree 自平衡树 数据有序(叶子节点) 搜索,线性访问,插入,删除:$O(logn)$由上图观察可知 B+Tree 非常平衡,每个叶子节点到根的距离都是$logN$ 每一个节点都至少装了一半以上的元素:M/2 - 1 ≤ #keys ≤ M - 1 每一个有k个key的节点都可以有K+1个子...…
-
Buffer Pool
Buffer PoolBuffer Pool是内存中的缓存,主要是存了那些从磁盘中读出来的数据页Buffer Pool带来的好处减少disk操作,让速度更快 如果取的时候Page已经在Buffer Pool里了,那么就不需要再去从磁盘里取了。Buffer Pool Manager 提供的API(简单版本) Page *FetchPage(page_id_t page_id) Read Page *NewPage(page_id_t *page_id) Write b...…
-
Spanner的设计
SpannerSpanner 的前世今生当时Google的数据库系统 BigTable:缺乏对复杂schema和强一致性的支持 (其实也是有需求才有Spanner) Megastore:性能不好Spanner是一个:高隔离,强一致(能在全球数据中心做到强一致,却又不损失太多可用性,这是如何做到的?),半结构化的分布式数据库影响了之后的数据库设计:CockroachDB (为什么叫蟑螂?我觉得应该是想要这个DB像小强一样顽强,高性能,话说国外也有打不死的小强这个俚语吗?哈哈) Cock...…
-
因果一致性
因果一致性Causal+ consistency–因果一致性背景:地理位置不同的副本设置多个涉及到跨地域副本的分布式系统Spanner: 写入会写到全局的Paxos组里,用的是Quorum,也就意味着它的请求要发送到各种数据中心 只读事务是严格串行化的(这是一致性模型里最高的一层) 写请求是如何做到强一致性的?通过2阶段提交把每一个Write都给予一个Tag,这个Tag里包含TrueTimeFacebook’s Memcached 单Master结构,只有Master可以接收写请...…
-
protobuf+go+rpc体验
Protobuf 简介Protobuf类似于XML、JSON等数据描述语言,它可以通过自带的工具生成代码,并实现将结构化数据序列化的功能。Protobuf中最基本的数据单元是message,是类似Go语言中结构体的存在。在message中可以嵌套message或其它的基础数据类型的成员。Protobuf 使用syntax = "proto3"; //采用proto3的语法package main;message String { string value = 1;}message关键...…
-
Linux常用命令
` Linux中的命令非常多,总结一些常用的命令,其它的边用边查即可`常用命令系统状况 ` top` 相当于是Win的任务管理器,可以查看所有进程的信息 输入M Memory 按内存使用排序 输入P Processor 按使用CPU排序 输入q Quit 退出 df -h diskfree 查看磁盘使用情况 free...…
-
ants库的使用
antsants库是一个利用到了池化技术的goroutine库,它实现了对大量goroutine的自动调度、复用、定期清理过期的goroutines、可以在创建池的时候限制goroutine的数量,复用资源,从而可以高效的执行任务。提供如下接口 获取运行中的 goroutine 数量 动态调整 Pool 大 释放 Pool 重启 Pool pool.go提供了ants.NewPool(创建协程池)、创建Pool对象需调用ants.New...…
-
go操作kafka
Kafka简介 消息队列,提供了消息持久化的功能,高效的IO核心原理:将消息以Append Log的方式顺序存储在磁盘上 核心概念 Producer 生产者即向kafka发送消息的一方 可以有多个 Consumer 消费者即从kafka接收消息的一方 可以有多个 Broker 即kafka集群中的服务器 Topic 主题即kafka会按照topic来分发消息 Partition kafka中的topic可以包含多个part...…
-
redis总结
Redis 知识总结1. Redis 概览Redis 和 memcache 的区别,Redis 支持的数据类型应用场景 redis 支持的数据结构更丰富 (string,hash,list,set,zset)。memcache 只支持 key-value 的存储; redis 原生支持集群,memcache 没有原生的集群模式。2. Redis 单线程模型redis 单线程处理请求流程redis 采用 IO 多路复用机制来处理请求,采用 reactor IO 模型, 处理流程如下: ...…
-
go中string的实现
introGo语言中字符串是一个不可修改的字节序列, 如果要做类比的话可以看作是一个只读的byte数组类型. 字符串有两种方式构建: 第一种是在代码中通过双引号包括起来的字符串字面值, 这是编译前就知道了字符串的内容; 另一种是在运行时通过代码运行动态产生的字符串.因为Go语言源代码要求是UTF8编码, 因此字符串面值的内容也是UTF8编码的. 为了方便面值字符串的遍历, Go语言的for range内置了对UTF8的支持:for i, c := range "hello, 世界" { ...…
-
feed系统数据量推算
背景介绍Feed是一种承载信息的单元,feed系统就是信息分发系统。Feed系统通常有两个要素,召回和排序,召回决定有哪些feed应该分发给哪些用户,并且由于用户的屏幕有限,需要设定优先级,因此就有了排序规则。根据这两点的不同,通常可以分为Timeline Feed和Top K FeedTimelineFeed指的是根据用户与用户之间的关注关系来召回Feed,然后基于发布时间排序的简单信息流系统。Top K Feed指的是根据某些召回策略,召回feed,然后基于推荐模型排序的复杂推荐系统。...…
-
go中map的实现
go中的map实现思路核心结构体hmap的结构其实刚开始看起来其实还是比较复杂的,有不少的字段,具体字段如下图所示: 字段 解释 count 键值对的数量 B 2^B=len(buckets) hash0 hash因子 buckets 指向一个数组(连续内存空间),数组的类型为[]bmap,bmap类型就是存...…
-
分布式一致性共识算法
分布式一致性/共识算法2PC强一致性,中心化的原子(多个节点事务同时提交成功或同时失败)提交协议场景:分布式事务,分布式副本准备阶段 提交阶段协调者(协调整个事务的提交和回滚),参与者(具体执行服务的节点)**2PC第一阶段 ** 询问阶段2PC第二阶段 提交阶段2PC存在的问题:同步阻塞 参与者需要等待协调者操作才能进行下阶段操作 协调者需要等待所有参与者的响应数据不一致 在第二阶段广播globalcommit消息时还剩下一部分没有广播到时其宕机了 。或者因为...…