2017年

go get 代理

go get 代理

代理服务端

要把 go get 请求转发别的 repo 上,需要利用 go get 的 discovery 特性去动态查找 repo。

首先要知道 go get 做了什么,定位到 repoRootForImportDynamic 函数(源文件 go/src/cmd/go/internal/get/vcs.go),可以知道命令将 ImportPath 作为 url 发起了一次请求(web.GetMaybeInsecure),并且将获取的到结果使用 parseMetaGoImports 函数(源文件 go/src/cmd/go/internal/get/discovery.go)解析。
根据 parseMetaGoImports 函数可以得知,结果作为 xml 解析,并且在查找所有 meta 元素是否存在 name 属性值为 go-import,如果存在则解析 content 属性值,拆分为 PrefixVCSRepoRoot

那我们可以明确知道了,我们需要返回一个 xml,内容格式可能是这样的

...

- 阅读全文 -

redis RENAME 阻塞

redis RENAME 命令按文档说法是存在一个隐式 DEL 操作,通过查阅代码 db.c 可以得知至少一次 dbDelete,至多两次 dbDelete。

在命令上 redis 是提供了两种删除的操作,DELUNLINK,分别对应了 dbSyncDeletedbAsyncDelete

dbDelete 是对 dbAsyncDelete/dbSyncDelete 的封装,并且由配置 lazyfree_lazy_expire 决定,两个函数区别 dictGenericDelete 是否在执行线程 free K/V pair 和 dict key 内存。

let's encrypt

安装

最近打算博客转 https, 有什么好处就不多说了, 反正是没人看的博客, 转了也不会有什么性能问题(笑).
在我自己的博客上使用 let's encrypt 证书还是非常方便的, 官方的文档和 certbot, 直接就迁移到了 https.
我这里就列一下 Ubuntu 16.04 - Nginx 环境下的命令流程, 但是最好以文档为主.

...

- 阅读全文 -