行如风 Blog

我干了什么 究竟拿了时间换了什么

读<<高效能阅读>>有感

前言 每当我拿起书本时,总有一个习惯:强迫自己从前往后,从头读到尾。 买了书后,迫不及待立下壮志:一定要读完这本书。但最终,由于这个习惯,让我很少看完一本书(当然小说除外:))。 最近看了《高效能阅读》,遂有此篇。 内容 读书分几个阶段 1.不要畏惧读书。 2.多方面的建立读书环境,培养读书兴趣 3.速读技巧 4.建立自己的读书笔记 在读小说时,只要自...

httprouter源码阅读

前言 在go web开发中,很多时候会选用一款web框架,随着项目功能增加,接口也越来越多,一款好的路由框架能很方便的帮助我们管理与维护繁多的接口地址。 抽空看了下httprouter的源码(gin框架内置了定制的httprouter),代码量很少(去掉空白和注释也就600行左右),本次就的源码记录下,以留备忘。 httprouter版本:1.3.0 使用 使用很简单,如: 1 ...

go bounds check(边界检测)

前言 我们在阅读go源码时,很多地方在操作数组或切片时,会有bounds check的注释, 比如go map在对tophash指定索引赋值(go map的源码阅读见 go map源码阅读及与php map实现对比这篇文章): 1 2 3 dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimizat...

go map源码阅读及与php map实现对比

前言 之前在openresty协程调度对比go协程调度文章中分析了go程序启动过程(从go程序开始执行到用户的main程序执行前发生了些什么),今天结合一个简短例子说下go map的底层实现(顺便看下在编译阶段发生了什么),同时对比下php的map实现 go map实现 说明:go版本:1.15.6,平台:linux 一段简单的代码如下: 1 2 3 4 5 6 7 8 9 10 ...

boltdb源码阅读

前言 最近抽时间看了boltdb的源码,代码量不大(大概4000行左右),而且支持事务,结构也很清晰,由于比较稳定,已经归档,确实是学习数据库的最佳选择。而且不少出名的开源项目在使用它,比如etcd,InfluxDB等。 本文记录下笔者在阅读源码后了解到的其工作原理,以留备忘。 简介 boltdb数据库是一款go开发的k/v数据库。其设计源于LMDB(Lightning Memory...

Openresty协程调度对比Go协程调度

在web编程领域,Openresty与Go均有十分优秀的处理能力,在面对高并发的web编程,两者一般都是首选的技术方案。这两者我也一直使用,而且两者均有协程,现总结下,留个备忘。 Openresty及其工作流程 基于Openresty 1.18版本 将Lua集成到Nginx中,而Nginx,更是高性能HTTP服务器的代表。 Nginx是多进程单线程:一个master进程和多个work...

从一个模糊词查询需求的处理方案讨论到一种极速匹配方案的实现

背景 某天,我们的产品经理突然找到我,说我们的广告业务上线后效果不错,但是需要做敏感词过滤处理,需要接入一个模糊词词典和一个精确词词典。然后我拿到了这两份词典,两份违禁词加起来总量近100w条。 这个需求简单来说就是如果用户的查询词中命中了违禁词的话是不能出广告的。如:用户query=怎么去故宫博物院,因为命中了故宫博物院,所以不能出广告。 最终我合并了这两份词表,并写了一个高...

从MongoID的生成讨论分布式唯一ID生成方案

背景 MongoDB,想必大家都使用过,在数据落盘后,查询该条数据时,会发现其会自动生成一条”_id”,如: 1 2 3 db.test.insert({"name":"tom"}) 查询结果: { "_id" : ObjectId("5fd049327fbb28868f4660a5"), "name" : "tom" } MongoID作为主键索引,即使是集群...

记一次cpu 100%问题排查

背景 服务器用的Openresty,代码用Lua+Php编写 处理 登录到机器,发现nginx一个worker进程出现了cpu 100%的情况: 使用pstack 多次查看该worker进程,也都是同样结果。 看来是代码出现了热循环,接下来要做的就是定位到热循环 的地方。 该接口除了使用lua外,还有c的扩展。 所以想着使用采样工具并生成火焰图来定位问题。这里使用春...

git push避免每次输入密码

1 2 在git push时每次都要输入用户名和密码是一件很痛苦的事 解决方法如下: 1.git bash进入当前项目(windows机在当前项目中点击右键->选择git bash here打开git bash) 2.在git bash中输入: 1 git config credential.helper store 3.git push到远程仓库时,输入正确用户...